본문 바로가기

Programming/JAVA

멀티 스레드(5) - 스레드 상태 1

JAVA logo image

 

 

 

스레드 상태에서부터는 내용이 다소 복잡해집니다. 스레드의 실행 과정은 간단해 보였지만(run 메서드 실행), 이 과정에서는 복잡한 상태 변동이 일어나기 때문이죠. 차근차근 짚어나가 보겠습니다. 

 

 

- 기본적으로 하나의 스레드 객체가 생성이 되면(NEW 상태)

- 스케줄링이 아직 되지 않았기 때문에 실행 대기 상태로 전환됩니다(RUNNABLE). 

- 스케줄링이 되면 CPU 점유 후 run( )을 실행합니다(RUNNING).

- RUNNING 상태에서는 run( ) 메서드를 모두 실행하기 전에 스케줄링에 의해

  실행 대기 상태로 돌아가 다른 스레드가 실행 상태로 변합니다.

   > 이렇게 번갈아가며 스레드는 실행과 실행 대기를 오가며 자신의 run( )을 조금씩 실행합니다.

- 실행 상태에서 run( ) 메서드가 종료되면 더 실행할 코드가 없기에

  스레드 실행은 멈추고 종료상태가 됩니다(TERMINATED).

- 단, 실행 상태에서 실행 대기 상태로 바로 이동하지 않고 일시 정지 상태로 가기도 합니다.

  > 일시 정지 상태에서는 스레드가 실행할 수 없는 상태가 됩니다.

  > WAITING, TIMED_WAITING, BLOCKED 상태가 존재합니다(추후 별도 설명)

  > 일시 정지 상태에서 실행을 하기 위에서는 반드시 실행 대기(RUNNABLE) 상태로 이동 후 실행 해야 합니다.

 

위에서 여러가지 스레드의 상태를 언급했는데요, 이러한 상태는 Thread클래스의 메서드인 getState( ) 메서드로 확인이 가능합니다. 이 메서드를 사용하면 Thread.State 타입의 열거 상수가 리턴됩니다. 

 

상태 열거 상수 설명
객체 생성 NEW 스레드 객체는 생성 되었으나, 아직 start( ) 메서드가 호출되지 않은 상황
실행 대기 RUNNABLE 실행 상태로 언제든지 갈 수 있는 상태
일시 정지 WAITING 다른 스레드가 통지할 때까지 기다리는 상태
TIMED_WAITING 주어진 시간 동안 기다리는 상태
BLOCKED 사용하고자 하는 객체의 락이 풀릴 때까지 기다리는 상태
종료 TERMINATED 실행을 마친 상태