[Java][Thread] 쓰레드의 실행 제어

2022. 6. 30. 15:22JAVA/Language

쓰레드의 스케줄링과 관련된 메서드

메서드 설명
static void sleep(long millis)
static void sleep(long millis, int nanos)
지정된 시간동안 쓰레드를 일시정지시킴. 지정한 시간이 지나고 나면, 자동적으로 다시 실행대기상태가 됨
void join()
void join(long millis)
void join(long millis, int nanos)
지정된 시간동안 쓰레드가 실행되도록 합니다. 지정된 시간이 지나거나 작업이 종료되면 join()을 호출한 쓰레드로 다시 돌아와 실행을 계속합니다.
void interrupt() sleep()이나 join()에 의해 일시정지상태인 쓰레드를 깨워서 실행대기상태로 만듭니다. 해당 쓰레드에서는 InterruptedException이 발생함으로써 일시정지상태를 벗어나게 됩니다.
void stop() (deprecated) 쓰레드를 즉시 종료시킵니다.
void suspend() (deprecated) 쓰레드를 일시정지시킵니다. resume()을 호출하면 다시 실행대기상태가 됩니다.
void resume() (deprecated) suspend()에 의해 일시정지상태에 있는 쓰레드를 실행대기상태로 만듭니다.
static void yield() 실행 중에 자신에게 주어진 실행시간을 다른 쓰레드에게 양보(yield)하고 자신은 실행대기상태가 됩니다.

 

쓰레드의 상태

상태 설명
NEW 쓰레드가 생성되고 아직 start()가 호출되지 않은 상태
RUNNABLE 실행 중 또는 실행 가능한 상태
BLOCKED 동기화블럭에 의해서 일시정지된 상태 (lock이 풀릴 때까지 기다리는 상태)
WATING
TIMED_WAITING
쓰레드의 작업이 종료되지는 않았지만 실행가능하지 않은(unrunnable) 일시정지 상태. TIMED_WATING은 일시정지시간이 지정된 경우를 의미함
TERMINATED 쓰레드의 작업이 종료된 상태

 

(1) : 실행 대기 상태에 있다가 자신의 차례가 되면 실행상태가 됩니다.

(2) : 실행중에 suspend(), sleep(), wait(), join(), I/O block에 의해 일시정지 상태가 되는 경우입니다. I/O block은 입출력 작업에서 발생하는 지연상태를 말합니다. 사용자의 입력이 기다리는 경우를 예로 들 수 있는데, 이런 경우 일시정지 상태에 있다가 사용자가 입력을 마치면 다시 실행대기 상태가 됩니다.

(3) : 지정된 일시정지 시간이 다되거나(time-out), notify(), resume(), interrupt()가 호출되면서 일시 정지 상태를 벗어나 다시 실행 대기열에 저장되어 자신의 차례를 기다리게 됩니다.

 

References

source code : https://github.com/yonghwankim-dev/java_study/tree/main/ch13
JAVA 스레드(thread) 상태(객체 생성, 실행 대기, 일시 정지, 종료)
[도서] Java의 정석, 남궁 성 지음