스레드는 7가지 상태를 가집니다
스레드의 상태를 정확히 알고 있어야 하는데, 스레드의 행동을 직접 제어할 경우가 있기 때문입니다
멀티 스레딩 환경에서 자원에 비해 사용해야하는 스레드 수가 많다면, 이를 통제하기 위해
Thread State의 상태를 변경해야 합니다
대표적인 7가지 Thread State는 다음과 같습니다
스레드가 생성되었으나 아직 시작되지 않은 초기 상태입니다
스레드 객체는 생성되었지만, 스케줄러에 의해 아직 실행 가능한 상태로 전환되지 않은 시점입니다
Runnable 상태는 스레드가 CPU 할당을 기다리고 있는 상태입니다
OS의 스케줄러는 이 상태의 스레드 중 하나를 선택해 Running 상태로 전환합니다
스레드가 CPU를 할당받아 실제로 실행 중인 상태입니다
이 상태에서 스레드는 실제 작업을 수행하게 됩니다
실행 중인 스레드는 다음과 같은 이유로 다른 상태로 전환될 수 있습니다
Blocked 상태는 스레드가 필요한 자원(주로 동기화된 자원)을 기다리고 있는 상태입니다
다른 스레드가 해당 자원을 사용 중이면, 스레드는 자원이 해제될 때까지 차단됩니다
예시:
스레드가 다른 스레드로부터 특정 신호(notify, notifyAll)를 받을 때까지 무기한 기다리는 상태입니다
이 상태에서는 특정 이벤트가 발생할 때까지 절대적으로 실행되지 않습니다
예:
Object.wait()
메서드Thread.join()
메서드지정된 시간이 경과하거나 특정 이벤트가 발생할 때까지 스레드가 일시적으로 대기 상태에 놓이는 상태입니다
예:
Thread.sleep(millis)
Object.wait(millis)
LockSupport.parkNanos(nanos)
스레드가 모든 작업을 완료하거나 예외로 인해 종료된 상태입니다
이 상태에 도달하면 더 이상 다시 시작할 수 없습니다
스레드는 다음과 같은 흐름을 따라 상태가 전환됩니다:
start()
메서드를 통해 New에서 Runnable로 전환됩니다스레드 상태 관리는 성능에 큰 영향을 미칠 수 있습니다
불필요한 스레드 상태 전이는 Context Switching 비용을 발생시키며, 성능 저하를 발생시킵니다
따라서 다음과 같은 최적화 전략이 필요합니다