Goal
- 스레드의 라이프 사이클에 대해 알아본다
스레드 라이프 사이클
스레드 객체 생성 부터 종료까지의 상태이다.
- 스레드는 객체를 생성하고 start()메소드를 호출하면 바로 스레드 실행처럼 보이지만, 실행 대기 상태이다
- 실행 대기 상태란 아직 스케쥴링이 되지 않아 실행을 기다리고 있는 상태이다.
- 실행 대기 상태에 있는 스레드 중에서 스레드 스케쥴링으로 선택된 스레드가 비로서 cpu를 점유하고 run()메소드를 실행한다.
- 이때를 실행 Running 상태라고 한다.
- 실행 상태의 스레드는 run()메소드를 모두 실행하기 전에 스레드 스케쥴링에 의해 다시 실행 대기로 돌아갈 수 있다.
- 그리고 실행 대기 상태에 있는 다른 스레드가 선택되어 실행 상태가 된다.
- 이렇게 스레드는 실행 대기 상태와 실행 상태를 번갈아 가며 자신의 run()메소드를 조금씩 실행한다.
- 실행 상태에서 run()메소드가 종료되면, 스레드의 실행은 멈추고 종료 상태가 된다.
스레드 스케쥴링 참고
일시 정지
- 경우에 따라, 스레드는 실행 상태에서 실행 대기 상태로 가지 않을 수 있다.
- 실행 상태에서 일시 정지 상태로 가기도 하는데 일시 정지 상태로 가기도 하는데, 이는 스레드가 실행할 수 없는 상태다
- 스레드가 다시 실행 상태로 가기 위해서는 일시 정지 상태에서 실행 대기 상태로 가야한다.
스레드 라이프 사이클 _상태
상태 | 열거 상수 | 설명 |
객체 생성 | NEW | 스레드 객체가 생성, 아직 start()메소드가 호출되지 않은 상태 |
실행 대기 | RUNNABLE | 실행 상태로 언제든지 갈 수 있는 상태 |
일시 정지 | WAITING | 다른 스레드가 통지할 때까지 기다리는 상태 |
TIMED_WATING | 주어진 시간 동안 기다리는 상태 | |
BLOCKED | 사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태 | |
종료 | TERMINATED | 실행을 마친 상태 |
타겟 스레드 상태 확인
public class StatePrintThread extends Thread{
private Thread targetThread;
public StatePrintThread(Thread targetThread) {
this.targetThread = targetThread;
}
public void run() {
while(true){
Thread.State state = targetThread.getState();
System.out.println("타겟 스레드 상태 :"+ state);
if(state == State.NEW){
targetThread.start();
}
if(state == State.TERMINATED){
break;
}
try{
Thread.sleep(500);
}catch (Exception e){
}
}
}
}
- 스레드 상태 얻기
- 객체 생성 상태일 경우 실행 대기 상태로 만듦
- 종료 상태일 경우 while 문 종료
- 0.5초간 실행정지
타겟 스레드
public class TargetThread extends Thread{
public void run() {
for(long i=0; i<1000000000; i++){}
try{
Thread.sleep(1500);
}catch (Exception e){
}
for(long i=0; i<1000000000; i++){}
}
}
- 10억번 루핑 돌게해서 RUNNABLE 상태유지
- 1.5초간 실행 정지
- 10억번 루핑 돌게해서 RUNNABLE 상태유지
실행
public class ThreadStateExample {
public static void main(String[] args){
StatePrintThread statePrintThread = new StatePrintThread(new TargetThread());
statePrintThread.start();
}
}
결과
타겟 스레드 상태 :NEW
타겟 스레드 상태 :RUNNABLE
타겟 스레드 상태 :TIMED_WAITING
타겟 스레드 상태 :TIMED_WAITING
타겟 스레드 상태 :TIMED_WAITING
타겟 스레드 상태 :RUNNABLE
타겟 스레드 상태 :TERMINATED
참고하면 좋을 이전 포스팅
참고
이것이 자바다 by 신용권
'JAVA > about java' 카테고리의 다른 글
[thread] 스레드의 상태 제어는 어떻게 하는가 (0) | 2023.09.08 |
---|---|
[thread] 스레드 우선순위와 동기화를 하는 이유 (0) | 2023.08.31 |
[thread] 멀티 스레드와 작업 스레드 생성 방법 (0) | 2023.08.31 |
[java] 열거타입 enum (0) | 2023.08.30 |
[java] equals(), hashcode(), toString() 재정의를 왜 하는가 (0) | 2023.08.24 |