(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++) {}//시간 지연용
}
}
쓰레드의 상태를 출력하기 위한 쓰레드
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();
}
}
}
}