본문 바로가기

Programming/JAVA

멀티 스레드(5) - 스레드 상태 2

 

 

 

앞서서 스레드의 상태에 대한 열거 상수 리스트까지 살펴보았습니다. 이제 이 내용을 바탕으로, 예제 코드를 작성해 보겠습니다.

 

 

 

 

멀티 스레드(5) - 스레드 상태 1

스레드 상태에서부터는 내용이 다소 복잡해집니다. 스레드의 실행 과정은 간단해 보였지만(run 메서드 실행), 이 과정에서는 복잡한 상태 변동이 일어나기 때문이죠. 차근차근 짚어나가 보겠습

nozeroslope.tistory.com

 

 

아래의 스레드는 특정 타겟 스레드의 상태를 0.5초 주기로 출력하는 스레드입니다.

// StatePrintThread.java
// 타겟 스레드의 상태를 출력해주는 스레드
public class StatePrintThread extends Thread {
	private Thread targetThread;
	
	// 파라미터에 상태를 조사할 대상 스레드를 전달
	public StatePrintThread(Thread targetThread) {
		this.targetThread = targetThread;
	}
	
	public void run() {
		while(true) {
			// 타겟 스레드의 상태를 얻는다
			Thread.State state = targetThread.getState();
			System.out.println("타겟 스레드 상태: " + state);
			
			// 객체 생성 상태이면 실행 대기로 전환
			if(state == Thread.State.NEW) {
				targetThread.start();
			}
			
			// 종료 상태이면 while문 종료
			if(state == Thread.State.TERMINATED) {
				break;
			}
			
			try {
				// 0.5초 간 일시 정지
				Thread.sleep(500);
			} catch(Exception e) {}
		}
	}
}

 

 

 

다음은 상태 출력의 대상이 되는 타겟 스레드입니다. 

// TargetThread.java
public class TargetThread extends Thread {
	public void run() {
		
		// 10억번 루핑 돌며 RUNNABLE 상태를 유지하게 함
		for(long i=0; i<1000000000; i++) {}
		
		try {
			// 1.5초간 일시 정지하며 TIMED_WAITING 상태를 유지
			Thread.sleep(1500);
		} catch(Exception e) {}
		
		// 10억번 루핑 돌며 RUNNABLE 상태를 유지하게 함
		for(long i=0; i<1000000000; i++) {}
	}
}

 

다시 한번 복기해보자면, 해당 타겟 스레드가 start( )로 실행되면 실행 대기(RUNNABLE)이 되고, run( )을 실행하게 됩니다. 그리고 1.5초간 sleep( )으로 TIME_WAITING가 된 다음 다시 루프가 돌게 되는 구조입니다. 

 

정리하면, 순서는

 

TargetThread의 객체 생성 [NEW] → for문 [RUNNABLE] → 1.5초간 sleep [TIME_WAITING] → for문 [RUNNABLE] → run( ) 종료 [TERMINATED]가 됩니다. 

 

 

이제 실행 클래스를 통해 StatePrintThread를 생성하고, 파라미터로 전달 받은 TargetThread의 상태를 출력해 보겠습니다.

 

public class ExampleMain {
	public static void main(String[] args) {
		StatePrintThread statePrintThread = new StatePrintThread(new TargetThread());
		statePrintThread.start();
	}
}

/* 출력
타겟 스레드 상태: NEW
타겟 스레드 상태: TIMED_WAITING
타겟 스레드 상태: TIMED_WAITING
타겟 스레드 상태: RUNNABLE
타겟 스레드 상태: TERMINATED
*/