
##스레드의 생명 주기
스레드는 생성(Create)되고, 실행(Run)되며, 종료(Terminate)되는 생명 주기를 갖습니다. 자바에서 스레드는 다양한 상태를 거치며 실행되며, 이 과정에서 여러 상태 전이를 경험합니다.
자바에서 스레드는 다음과 같은 주요 상태를 가집니다.
Thread 객체가 생성되었지만 start() 메서드가 호출되지 않은 경우.Thread thread = new Thread(runnable);start() 메서드가 호출되면 이 상태로 전이됩니다.thread.start();synchronized 블록에 진입하려고 할 때 락을 얻지 못하면 Blocked 상태가 됩니다.wait(), join() 등의 메서드를 호출하면 이 상태가 됩니다.synchronized(obj) {
obj.wait(); // 무기한 대기 상태
}sleep(long millis), wait(long timeout), join(long millis) 메서드 호출 시 해당 상태가 됩니다.Thread.sleep(1000); // 1초 동안 대기 (Timed Waiting)자바 스레드는 아래와 같은 상태 전이를 겪습니다.
New → Runnable
start() 호출 시 실행 가능 상태(Runnable)로 전이됨.Runnable → Blocked / Waiting / Timed Waiting
Blocked: 스레드가 동기화 락을 얻지 못할 때.Waiting: wait(), join() 등으로 무기한 대기할 때.Timed Waiting: sleep(time), wait(time), join(time) 등으로 일정 시간 대기할 때.Blocked / Waiting / Timed Waiting → Runnable
Runnable → Terminated
run() 메서드 실행이 끝나면 종료 상태(Terminated)가 됨.자바 스레드는 New → Runnable → Running → Blocked/Waiting/Timed Waiting → Runnable → Terminated의 흐름을 따르며 실행됩니다. 운영체제의 스케줄러가 CPU 시간을 관리하므로, Runnable 상태에 있다고 즉시 실행되는 것이 아니라 스케줄러의 결정에 따라 실행된다는 점을 기억해야 합니다.
이해를 돕기 위해 아래 그림을 참고하면 좋습니다.
New → Runnable → Running → Terminated
↘
Blocked / Waiting / Timed Waiting → Runnable
스레드의 상태를 적절히 관리하면 성능을 최적화하고, 동시성 문제를 방지할 수 있습니다. 스레드를 사용할 때 상태 전이를 잘 이해하고 활용하세요!