4-2.(5) Thread의 상태

10424 단어 20200922Thread20200922

Thread의 상태

(1) NEW : 스레드가 생성되고 아직 start()가 호출되지 않은 상태
(2) RUNNABLE : 실행 중 또는 실행 가능한 상태
(3) BLOCKED : 동기화 블럭에 의해서 일시정지된 상태(lock이 풀릴때까지 기다리는 상태)
(4) WATTING, TIMED_WAITING : 스레드의 작업이 종료되지는 않았지만 실행가능하지 않은(UNRUNNABLE)일시정지 상태. TIMED_WAITING은 일시정지 시간이 지정된 경우임.
(5) TERMINATED : 스레드의 작업이 종료된 상태

Thread.class 안에 존재함

public enum State {
	NEW,
    	RUNNABLE,
    	BLOCKED,
    	WAITING,
	TIMED_WAITING,
    	TERMINATED;
}

T10_ThreadStateTest

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=1; i<=1000000000L;i++) {} //시간 지연용
		try {
			Thread.sleep(1500);//1.5초
		}catch(InterruptedException ex) {
			ex.printStackTrace();
		}
		for(long i=1; i<1000000000L; i++) {}//시간 지연용
	}
}

쓰레드의 상태를 출력하기 위한 쓰레드

  • 1.상태를 출력할 쓰레드가 저장될 변수 필요
  • 2.Thread의 상태 구하기 : getState()메서드 이용
  • 3.new상태인지(new 상태면 start();)
    terminated상태인지(종료 상태면 break; -> 무한루프 빠져나오기)
    검사!
class StatePrintThread extends Thread{
	private Thread targetThread; // 상태를 출력할 쓰레드가 저장될 변수
	
	public StatePrintThread(Thread targetThread) {
		this.targetThread = targetThread;
	}
	
	@Override
	public void run() {
		while(true) {
			//Thread의 상태 구하기(getState()메서드 이용) -> public enum State {}
			Thread.State state = targetThread.getState();
			System.out.println("타겟 쓰레드의 상태값 : "+ state);
			
			//new상태인지 검사
			if(state == Thread.State.NEW) { // -> Runnable상태로 감
				targetThread.start();
			}
			
			//타겟쓰레드가 종료상태인지 검사
			if(state== Thread.State.TERMINATED) {
				break; // 무한루프 빠져나오기
			}
			
			try {
				Thread.sleep(500);//0.5초마다 getState 찍기
			}catch(InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}

좋은 웹페이지 즐겨찾기