스레드 객체를 생성하고, start() 메소드를 호출하면 곧바로 스레드가 실행되는 것처럼 보이지만
사실은 실행 대기 상태가 된다.
실행 대기 상태란 아직 스케줄링이 되지 않아서 실행을 기다리고 있는 상태를 말한다.
실행 대기 상태에 있는 스레드 중에서 스레드 스케줄링으로 선택된 스레드가 비로서
CPU를 점유하고 run() 메소드를 모두 실행하기 전에
스레드 스케줄링에 의해 다시 실행 대기 상태로 돌아갈수 있다
그리고 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 된다
이렇게 스레드는 실행 대기 상태와 실행 상태를 번갈아가면서 자신으 run() 메소드를 조금씩 실행 한다.
실행 상태에서 run() 메소드가 종료 되면, 더 이상 실행할 코드가 없기 때문에 스레드의 실행은 멈추게 된다
이를 종료 상태 라고 한다
경우에 따라서 스레드는 실행 상태에서 실행 대기 상태로 가지 않을 수도 있다.
실행 상태에서 일시 정지 상태로 가기도 하는데, 일시 정지 상태는 스레드가 실행 할 수 없는 상태 이다
일시 정지 상태는 WAITING, TIMED_WATING, BLOCKED 가 있는데,
스레드가 다시 실행 상태로 가기 위해서는 일시 정지 상태에서 실행 대기 상태로 가야 한다는 것만 알아 두자
스레드의 상태를 코드에서 확인 할 수 있도록 하기 위해 자바 5부터 Thread 클래스에 getState() 메소드가 추가 되었다.
getState() 메소드는 위 표 처럼 스레드 상태에 따라서 Thread.state 열거 상수를 리턴 한다
스레드의 상태를 출력하는 StatePrintThread 클래스
생성자 매개값으로 받은 타겟 스레드의 상태를 0.5초 주기로 출력한다.
public class StatePrintThread extends Thread {
private Thread targetThread;
public StatePrintThread(Thread targtThread) {
this.targetThread = targetThread;
}
public void run(){
while(true){
Thread.State state = targetThread.getState(); // 스레드 상태 얻기
System.out.println("타겟 스레드 상태 : " + state);
if(state == Thread.State.NEW) {
targetThread.start(); // 객체 생성 상태일 경우 실행 대기 상태로 만듬
}
if(state == Thread.State.TERMINATED){
break; // 종료 상태 일 경우 while 문을 종료 함
}
try{
//0.5초간 일시 정지
Thread.sleep(500);
} catch(Exception e){}
}
}
}
public class TargetThread extends Thread {
public void run() {
for(long i=0; i<10000000; i++){}
try {
Thread.sleep(15000);
} catch(Exception e) {}
for (long i = 0; i < 100000000; i++){}
}
}
TargerThread 객체로 생성 되면 NEW 상태를 가지고 , run() 메소드가 종료 되면 TERMINATED 상태가 되므로 결국 다음과 같은 상태로 변한다 .
NEW -> RUNNABLE -> TIMED_WAITING -> RUNNALBE -> TERMINATED
다음 StatePrintThread 를 생성해서 매개값으로 전달받은 TargteThread의 상태를 출력하도록 작성된 실행 클래스이다
publiic class ThreadStateExample {
public static void main(String[] args){
StatePrintThread statePringThread = new StatePringThread(new TargetThread());
statePringThread.start();
}
}
'Back-end > 이것이 자바다[신용권 한빛미디어]' 카테고리의 다른 글
스레드 그룹(ThreadGroup) (0) | 2021.12.12 |
---|---|
스레드 상태 제어 (0) | 2021.12.05 |
동기화 메소드와 동기화 블록 (0) | 2021.12.04 |
스레드 우선순위 (0) | 2021.11.27 |
작업 스레드 생성과 실행 (0) | 2021.11.24 |