자바에서 스레드의 생명주기는 여러 상태(state)로 나누어지며, 각 상태는 스레드가 실행되고 종료되기까지의 과정을 나타낸다.


New (새로운 상태)

  • 스레드가 생성되고 아직 시작되지 않은 상태
  • Thread 객체는 생성되었지만, start() 메서드가 호출되지 않은 상태

 

Runnable (실행 가능 상태)

  • 스레드가 실행될 준비가 완료된 상태 → CPU에 올릴 수 있다
  • start() 메서드가 호출되면 이 상태로 진입
  • 스레드가 실행될 준비가 되어있고, 실제로 CPU에서 작업할 수 있는 상태
    • 하지만 모든 Runnable 스레드가 동시에 실행되진 않고, 운영체제의 스케줄링 방식에 따라 차례대로 실행된다
    • 스케줄링 실행 대기열에 있거나, 현재 CPU에서 돌아가고 있는 스레드 구분 불가
  • 보통 실행 상태라고 칭한다

 

Blocked (차단 상태)

  • 스레드가 다른 스레드에 의해 동기화 락을 얻기 위해 기다리는 상태
  • 즉, synchronized 블럭에 진입하기 위해 락을 얻어야하는 경우에 이 상태에 진입
    • 다른 스레드가 lock을 점유한 경우

 

Waiting (대기 상태)

  • 스레드가 다른 스레드의 특정 작업이 완료 되기를 무기한 기다리는 상태
  • wait(), join() 메서드가 호출될 때 이 상태에 진입
  • 다른 스레드가 notify() 나 notifyAll() 을 호출하거나, join() 이 완료될 때 까지 대기

 

Timed Waiting (시간 제한 대기 상태)

  • 스레드가 특정 시간동안 다른 스레드의 작업이 완료되기를 기다리는 상태
  • 대표적으로 sleep(시간), wait(시간), join(시간) 메서드가 호출 될 때 이 상태로 진입
  • 주어진 시간이 끝나거나 다른 스레드가 해당 스레드를 깨우면 상태에서 벗어난다

 

Terminated (종료 상태)

  • 스레드 실행이 완료된 상태
  • 정상적으로 종료하거나, 예외가 터져 종료 되었을 때 이 상태로 진입
  • 스레드는 한번 종료되면 살릴 수 없음

Thread의 상태 전이 정리

  1. New → Runnable : start() 메서드를 통해 실행
  2. Runnable → Blocked / Waiting / Timed Waiting : 스레드가 락을 획득하지 못하거나, 시간 관련 메서드(sleep, wait)가 호출되면 이 상태로 진입
  3. Blocked / Waiting / Timed Waiting → Runnable : 스레드가 락을 얻거나, 기다림이 완료되면 다시 Runnable 상태로 진입
  4. Runnable → Terminated : run() 메서드가 종료되면 상태 전