고급 JAVA

JAVA - 쓰래드 상태

햄찌개 2020. 9. 23. 12:46

 * <쓰레드의 상태>

 * - NEW : 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
 * - RUNNABLE : 실행 중 또는 실행 가능한 상태
 * - BLOCKED : 동기화 블럭에 의해서 일시정지된 상태 (lock이 풀릴때까지 기다리는 상태)
 * - WAITING, TIMED_WAITING : 쓰레드 작업이 종료되지는 않았지만 실행 가능하지 않은 (UNRUNNABLE)일시정지상태
 * - TERMINAED : 쓰레드의 작업이 종료된 상태 

public class T10_ThreadStateTest {
	

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

}

/**
 *모니터링 대상 쓰레드 
 */
class TargetThread extends Thread {
	@Override
	public void run() {
		for (long i = 1L; i <= 1000000000L; i++) {
		} // 시간 지연용
		try {
			Thread.sleep(1500);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		for (long i = 1L; i <= 1000000000L; i++) {
		} // 시간 지연용
	}
}

/**
 * 쓰레드의 상태를 출력하는기 위한 쓰레드 클레스
 */
class StatePrintThread extends Thread{
	private  Thread targetThread;	//상태를 출력할 쓰레드가 저장될 변수

	public StatePrintThread(Thread targetThread) {
		this.targetThread = targetThread;
	}
	@Override
	public void run() {
		while (true) {
			//Thread의 상태 구하기 (getState()메서드 이용)
			Thread.State state = targetThread.getState();
			System.out.println("타겟 쓰레드 상태값 :"+ state);
			
			//NEW 상태 인지 검사
			if(state == Thread.State.NEW) {
				targetThread.start();
			}
			//타겟쓰레드가 종료 상태 인지 검사
			if(state == Thread.State.TERMINATED) {
				break;
			}
			try {
				Thread.sleep(500);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
	
}