본문 바로가기
잡다구리

스레드 상태 (Thread State)

by Growing! 2022. 8. 12.

스레드 State

(출처: https://www.baeldung.com/java-thread-lifecycle)

스레드의 상태는 Thread.State enum에 정의되어 있다.

  1. 새로운 스레드가 만들어지면 NEW 상태가 된다. 아직 start() 메소드가 호출되지 않은 시점이다.
  2. 스레드의 start()메소드가 호출되면 RUNNABLE 상태로 전이된다. 스케줄러가 선택해 주어야 실행이 될 수 있다. CPU를 점유하지 않은 상태이다.
  3. 스레드 스케줄러가 이 스레드를 선택하면 RUNNING 상태로 전이된다. run() 메소드가 수행된다. CPU를 점유하는 상태이다.
    • 스레드의 갯수가 CPU의 갯수 보다 많은 경우, 스레드의 실행 순서를 정해야 한다.
  4. 스레드의 wait 동작이 호출되면(sleep(timeout) object.wait(timeout), otherThread.join(timeout), LockSupport.park*() 메소드) TIME_WAITING 상태로 전이된다.
  5. waiting time이 지나면 다시 RUNNABLE 상태로 전이되고, 스레드 스케줄러가 선택할 수 있는 후보가 된다.
  6. RUNNING 상태에서는 object.wait(), otherThread.join(), LockSupport.park() 메소드를 호출하여 monitor condition을 기다릴 수 있으며 스레드는 WAITING 상태로 전이된다.
  7. Object.wait() 메소드를 호출한 스레드는 다른 스레드가 object.notify()object.notifyAll() 메소드를 호출해야 다시 RUNNABLE 상태로 돌아온다. otherThread.join() 메소드를 호출한 스레드는 대상 스레드가 종료되어야 RUNNABLE 상태로 돌아온다.
  8. 스레드가 run 메소드를 시작한 이후에, 보호받는 리소스에 접근하려고 하는데 해당 리소스에 아직 접근할 수 없다면 BLOCKED 상태로 전이된다. 보호받는 리소스란 synchronized 메소드나 monitor lock에 의해 보호받는 상태에 있는 리소스를 의미한다.
  9. 해당 리소스가 접근 가능하게 되면 이 스레드는 보호받는 리소스에 접근할 수 있게되며 RUNNABLE 상태로 전이된다.
  10. RUNNING 스레드가 실행을 마치면 TERMINATED 상태로 전이된다.

Monitor

  • 자바 객체는 하나의 monitor를 가짐
  • 어떤 monitor는 하나의 스레드에만 점유될 수 있음
  • 어떤 객체의 monitor가 특정 스레드에서 점유하고 있다면, 다른 스레드는 그 객체에 진입하지 못하고, monitor가 반환될 때 까지 Wait Queue에 대기해야 함

Thread Dump 얻기

jps로 JVM PID를 얻은 다음, jstack {pid}로 덤프를 출력할 수 있다.
혹은 kill -3 {pid}로 얻을 수도 있다.

Thread Dump 분석하기 (링크들)

댓글