NEW
처음 객체 생성된 후 상태
RUNNABLE
start() 메서드로 실행한 후 상태
실행과 실행 대기를 반복하면서 CPU를 다른 쓰레드들과 나눠 가짐
일시정지 상태로 전환 가능 (TIMED_WAITING, BLOCKED, WAITING)
TERMINATED
run() 메서드 종료 후 상태
TIMED_WAITING
Thread.sleep(long millis) 또는 join(long millis) 호출: RUNNABLE -> TIME_WAITING
일시정지 시간 종료 또는 interrupt() 호출 : TIMED_WAITING -> RUNNABLE
BLOCKED
동기화 메서드 또는 동기화 블록을 실행하기 위해 먼저 실행 중인 쓰레드의 실행 완료를 기다리는 상태
앞의 쓰레드의 동기화 영역 수행이 완료되면 해당 RUNNABLE 상태가 돼 동기화 영역을 실행하게 됨
WAITING
join() 메서드 호출시 상태 - join()의 대상이 된 쓰레드가 종료되거나 interrupt() 메서드 호출시 다시 RUNNABLE로 돌아감
wait() 메서드 호출시 상태 - notify(), notifyAll() 로 RUNNABLE로 돌아감
이 때 wait(), notify(), notifyAll()은 동기화 블록 내에서만 사용 가능
public class Study{
public static void main(String[] args) {
// 쓰레드 상태 저장 클래스
Thread.State state;
// 1. 객체 생성(NEW)
Thread myThread = new Thread(){ // 익명 이너 클래스로 쓰레드 객체 생성
@Override
public void run(){
for(long i=0; i<1000000000L; i++){} // 시간 지연
}
};
state = myThread.getState(); // 쓰레드의 상태 값 가져오기 (쓰레드의 상태를 Thread.State 타입에 저장된 문자열 상숫값 중 하나로 리턴)
System.out.println("myThread state = " + state);
// 2. myThread 시작
myThread.start();
state = myThread.getState();
System.out.println("myThread state = " + state);
// 3. myThread 종료
try{
myThread.join(); // 해당 쓰레드가 완료될 때까지 main 쓰레드 일시 정지
} catch(InterruptedException e){}
state = myThread.getState();
System.out.println("myThread state = " + state);
}
}
MyThread state = NEW
MyThread state = RUNNABLE
MyThread state = TERMINATED
'BACK > JAVA' 카테고리의 다른 글
[JAVA] 자바로 파일 관리하기(File 클래스) (0) | 2022.10.23 |
---|---|
[JAVA] 람다식(메서드 구현 축약, 메서드 참조, 생성자 참조) (0) | 2022.10.02 |
[JAVA] 프로그램, 프로세스, 쓰레드 개념 (0) | 2022.08.18 |
[JAVA] 쓰레드의 동기화(메서드 동기화, 블록 동기화) (0) | 2022.08.10 |
[JAVA] 쓰레드의 속성 (0) | 2022.08.09 |