##스레드의 생명 주기
스레드는 생성(Create)되고, 실행(Run)되며, 종료(Terminate)되는 생명 주기를 갖습니다. 자바에서 스레드는 다양한 상태를 거치며 실행되며, 이 과정에서 여러 상태 전이를 경험합니다.


스레드의 상태 (Thread States)

자바에서 스레드는 다음과 같은 주요 상태를 가집니다.

1. New (새로운 상태)

  • 스레드가 생성되었지만 아직 실행되지 않은 상태입니다.
  • Thread 객체가 생성되었지만 start() 메서드가 호출되지 않은 경우.
  • 예제:
    Thread thread = new Thread(runnable);

2. Runnable (실행 가능 상태)

  • 스레드가 실행 준비가 완료된 상태입니다.
  • start() 메서드가 호출되면 이 상태로 전이됩니다.
  • CPU가 할당되면 실행됩니다.
  • 예제:
    thread.start();
  • 참고: Runnable 상태에 있다고 해서 반드시 실행되는 것은 아닙니다! CPU 스케줄링에 의해 실행 여부가 결정됩니다.

3. Blocked (차단 상태)

  • 스레드가 동기화 락을 얻지 못해 기다리는 상태입니다.
  • 예를 들어 synchronized 블록에 진입하려고 할 때 락을 얻지 못하면 Blocked 상태가 됩니다.

4. Waiting (대기 상태)

  • 스레드가 무기한으로 다른 스레드의 작업을 기다리는 상태입니다.
  • wait(), join() 등의 메서드를 호출하면 이 상태가 됩니다.
  • 예제:
    synchronized(obj) {
        obj.wait(); // 무기한 대기 상태
    }

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

  • 스레드가 일정 시간 동안 다른 스레드의 작업을 기다리는 상태입니다.
  • sleep(long millis), wait(long timeout), join(long millis) 메서드 호출 시 해당 상태가 됩니다.
  • 예제:
    Thread.sleep(1000); // 1초 동안 대기 (Timed Waiting)

6. Terminated (종료 상태)

  • 스레드의 실행이 완료된 상태입니다.
  • 정상 종료되거나 예외로 인해 종료될 수 있습니다.

스레드 상태 전이 과정

자바 스레드는 아래와 같은 상태 전이를 겪습니다.

  1. New → Runnable

    • start() 호출 시 실행 가능 상태(Runnable)로 전이됨.
  2. Runnable → Blocked / Waiting / Timed Waiting

    • Blocked: 스레드가 동기화 락을 얻지 못할 때.
    • Waiting: wait(), join() 등으로 무기한 대기할 때.
    • Timed Waiting: sleep(time), wait(time), join(time) 등으로 일정 시간 대기할 때.
  3. Blocked / Waiting / Timed Waiting → Runnable

    • 락을 얻거나 대기 시간이 종료되면 다시 실행 가능 상태로 전이됨.
  4. Runnable → Terminated

    • run() 메서드 실행이 끝나면 종료 상태(Terminated)가 됨.

마무리

자바 스레드는 New → Runnable → Running → Blocked/Waiting/Timed Waiting → Runnable → Terminated의 흐름을 따르며 실행됩니다. 운영체제의 스케줄러가 CPU 시간을 관리하므로, Runnable 상태에 있다고 즉시 실행되는 것이 아니라 스케줄러의 결정에 따라 실행된다는 점을 기억해야 합니다.

이해를 돕기 위해 아래 그림을 참고하면 좋습니다.

New → Runnable → Running → Terminated
                ↘
          Blocked / Waiting / Timed Waiting → Runnable

스레드의 상태를 적절히 관리하면 성능을 최적화하고, 동시성 문제를 방지할 수 있습니다. 스레드를 사용할 때 상태 전이를 잘 이해하고 활용하세요!

profile
배움을 추구하는 개발자

0개의 댓글