
Java의 Thread의 생명 주기는 여러 state로 나뉘어지며, 각 상태는 Thread가 실행되고 종료되기까지의 과정을 나타냅니다.
이 상태는 스레드가 실행될 준비가 되어 있음을 나타내며, 실제로 CPU에서 실행될 수 있는 상태이다.
그러나 Runnable 상태에 있는 모든 스레드가 동시에 실행되는 것은 아니다.
운영체제의 스케줄러가 각 스레드 에 CPU 시간을 할당하여 실행하기 때문에, Runnable 상태에 있는 스레드는 스케줄러의 실행 대기열에 포 함되어 있다가 차례로 CPU에서 실행된다.
참고로 운영체제 스케줄러의 실행 대기열에 있든, CPU에서 실제 실행되고 있든 모두 RUNNABLE 상태다. 자바에서 둘을 구분해서 확인할 수는 없다
스레드가 다른 스레드에 의해 동기화 락을 얻기 위해 기다리는 상태이다.
예를 들어, synchronized 블록에 진입하기 위해 락을 얻어야 하는 경우 이 상태에 들어간다.
스레드가 다른 스레드의 특정 작업이 완료되기를 무기한 기다리는 상태이다.
wait() , join() 메서드가 호출될 때 이 상태가 된다.
스레드는 다른 스레드가 notify() 또는 notifyAll() 메서드를 호출하거나, join() 이 완료될때까지 기다린다.
스레드가 특정 시간 동안 다른 스레드의 작업이 완료되기를 기다리는 상태이다.
sleep(long millis) , wait(long timeout) , join(long millis) 메서드가 호출될 때 이 상태가 된다.
주어진 시간이 경과하거나 다른 스레드가 해당 스레드를 깨우면 이 상태에서 벗어난다.
스레드의 실행이 완료된 상태이다.
스레드가 정상적으로 종료되거나, 예외가 발생하여 종료된 경우 이 상태로 들어간다. 스레드는 한 번 종료되면 다시 시작할 수 없다.
Reference :
- 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성