본문 바로가기

Language/Java

스레드의 생명주기

자바 스레드의 생명 주기는 여러 상태로 나뉘어진다.

NEW (새로운 상태)

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

Runnable (실행 가능 상태)

  • 스레드가 실행될 준비가 된 상태이다.
  • start() 메서드가 호출되면 스레드가 Runnable 상태가 된다.
  • CPU 코어 하나 당 한 번에 하나의 스레드만 실행이 가능하기 때문에 Runnable 상태의 스레드라고 해서 반드시 실행 중인 것은 아니다. Runnable 상태에 있는 스레드는 스케줄러의 실행 대기열에 포함되어 있다가 차례로 CPU에서 실행된다.
  • 운영체제 스케줄러의 실행 대기열에 있든, CPU에서 실제 실행되고 있든 모두 Runnable 상태이다.

Blocked (차단 상태)

  • 스레드가 동기화 락을 얻기 위해 기다리는 상태이다.
  • 예를 들어, synchronized 블록에 진입하기 위해 락을 대기하는 상태이다.

Waiting (대기 상태)

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

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

  • 스레드가 특정 시간 동안 다른 스레드의 작업이 완료되기를 기다리는 상태이다.
  • sleep(long millis), wait(long millis), join(long millis) 메서드가 호출될 때 이 상태가 된다. 
  • 주어진 시간이 경과되거나, 다른 스레드가 해당 스레드를 깨우면 이 상태에서 벗어난다.

Terminated (종료 상태)

  • 스레드 실행이 완료된 상태이다.
  • 스레드가 정상적으로 종료되거나, 예외가 발생하여 종료된 경우 Terminated 상태가 된다.

Reference

  • 김영한의 실전 자바 - 고급 1편, 멀티스레드와 동시성