본 포스팅은 [이것이 자바다]의 내용을 참고하여 작성하였습니다.
스레드 객체를 생성하고 start() 메소드를 실행하면, 실행 대기 상태가 된다.
(실행 대기 상태란, 아직 스케줄링이 되지 않아 실행을 기다리고 있는 상태를 말한다.)
실행 대기 상태에 있는 스레드 중에서 스레드 스케줄링으로 선택된 스레드가 CPU를 점유하고 run() 메소드를 실행한다. 이 때를 실행(Running) 상태라고 한다.
실행 상태의 스레드는 run() 메소드를 전부 실행하기 전에 스레드 스케줄링에 의해 다시 실행 대기 상태로 돌아갈 수 있다. 그리고 다른 드레스가 선택되어 실행 상태가 된다.
이러한 과정을 반복하며 스레드는 자신의 run() 메소드를 조금씩 실행하고, 실행된 상태에서 run() 메소드가 종료되면 더 이상 실행할 코드가 없기 때문에 스레드의 실행은 멈추게 된다. 이 때를 종료 상태라고 한다.
경우에 따라 스레드는 실행 상태에서 실행 대기 상태로 가지 않을 수도 있다.
실행 상태에서 일시 정지 상태로 가기도 하는데, 일시 정지 상태는 스레드가 실행할 수 없는 상태이다.
(일시 정지 상태는 WAITING, TIMED_WAITING, BLOCKED가 있다.)
스레드가 다시 실행 상태로 가기 위해서는 일시 정지 상태에서 실행 대기 상태로 가야 한다는 것만 기억하자.
이러한 스레드의 상태를 코드에서 확인할 수 있도록, Thread 클래스의 getState() 메소드를 사용할 수 있다.
getState()메소드는 다음 표처럼 스레드 상태에 따라서 Thread.State 열거 상수를 리턴한다.
다음은 스레드의 상태를 출력하는 StatePrintThread 클래스이다. 생성자 매개값으로 받은 타겟 스레드의 상태를 0.5초 주기로 출력한다.
public class StatePrintThread extends Thread {
private Thread targetThread;
public StatePrintThread(Thread targetThread) { //매개변수: 상태를 조사할 스레드
this.targetThread = targetThread;
}
public void run() {
while(true) {
// 1. 스레드 상태 얻기
Thread.State state = targetThread.getState();
System.out.println("타겟 스레드 상태: " + state);
// 2. 객체 생성 상태일 경우 실행 대기 상태로 만듦
if(state == Thread.State.NEW) {
targetThread.start();
}
// 3. 종료 상태일 경우 while문을 종료함
if(state == Thread.State.TERMINATED) {
break;
}
try {
// 0.5초간 일시 정지
Thread.sleep(500);
} catch(Exception e) {}
}
}
}
코드를 실행하면 타겟 스레드의 상태가 0.5초마다 출력될 것이다.
(NEW, RUNNABLE, TIMED_WAITING, TERMINATED, .. 등)
'Study in SSAFY > 이것이 자바다' 카테고리의 다른 글
[이것이 자바다] 16.11 스트림과 병렬처리 - 수집(collect()) (0) | 2022.09.14 |
---|---|
[이것이 자바다] 12.6 멀티스레드 - 스레드 상태 제어 (0) | 2022.09.12 |
[이것이 자바다] 12.4 멀티스레드 - 동기화 메소드와 동기화 블록 (0) | 2022.09.12 |
[이것이 자바다] 11. 기본 API 클래스(Math~Formatting) (0) | 2022.08.10 |
[이것이 자바다] 10. 예외 처리 (0) | 2022.07.31 |