본문 바로가기

Programming/JAVA

멀티 스레드(6) - 스레드 상태 제어 1

 

[스레드 상태 제어]라는 용어의 개념이 무엇인지부터 쉽게 설명해 보겠습니다. 우리가 미디어 플레이어로 동영상을 재생을 하다보면, 영상을 정지했다가 다시 재생하기도 하고 영상 재생을 종료하기도 합니다. 간단한 동작이지만 이는 '동영상 스레드'를 일시 정지하거나 종료 상태로 만들면서 실행 중인 스레드의 상태를 변경하게 됩니다. 

 

위와 같이 실행 중인 스레드의 상태를 변경하는 것을 [스레드 상태 제어]라고 합니다. 이 스레드 상태 제어는 기본적인 스레드의 상태에 기반해 설명하기 때문에, 앞선 스레드 상태와 관련된 내용을 리뷰해 보시기 바랍니다. 

 

 

 

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

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

nozeroslope.tistory.com

 

 

 


 

 

 

 

아래 그림을 통해서 스레드 상태의 흐름에 따라, 스레드의 상태를 제어하는 메서드들을 살펴보겠습니다. 참고로 취소선 처리된 메서드는 deprecated 된 메서드입니다.

 

 

 

 

 

 

아래 표에서 각각의 메서드에 대해서 기술해 보겠습니다. 

 

동작 메서드 설명
일시 정지 > 실행 대기 interrupt( ) 일시 정지 상태의 스레드에서 InterruptedException 예외를 발생 시켜, 예외 처리 코드(catch)에서 실행 대기 상태로 가거나 종료 상태로 갈 수 있도록 한다.
notify( )
notifyAll( )
동기화(synchronized) 블록 내에서 wait( ) 메서드에 의해 일시 정지가 된 스레드를 실행 대기 상태로 만든다.
[deprecated] resume( ) suspend( )에 의해 일시 정지 상태인 스레드를 실행 대기 상태로 만든다.
 - 대신 notify( ), notifyAll( ) 사용
실행 > 일시 정지 sleep(long millis)
sleep(long millis, int nanos)
주어진 시간 동안 스레드를 일시 정지 상태로 만들고, 주어진 시간이 지나면 자동으로 실행 대기 상태가 된다.
join( )
join(long millis)
join(long millis, int nanos)
join( ) 메서드를 호출한 슽레드는 일시 정지 상태가 된다. 실행 대기 상태로 가기 위해서는 join( ) 메서드를 멤버로 가지는 스레드가 종료되거나 파라미터로 주어진 시간이 지나야 한다.
wait( )
wait(long millis)
wait(long millis, int nanos)
동기화(synchronized) 블록 내에서 스레드를 일시 정지 상태로 만든다. 파라미터로 주어진 시간이 지나면 자동으로 실행 대기 상태로 전환되는데, 파라미터가 없는 wait( )로 실행되었을 경우에는 notify( ), notifyAll( )로 실행 대기상태가 된다.
[deprecated] suspend( ) 스레드를 일시 정지 상태로 만들고, resume( )으로 실행 대기 상태로 만든다. - 대신 wait( ) 사용
실행 > 실행 대기 yield( ) 실행 중에 우선순위가 동일한 다른 스레드에게 실행을 양보하고, 실행 대기 상태로 전환 한다.
실행 > 종료 [deprecated] stop( ) 스레드를 즉시 종료시킨다.

 

* 위 메서드 중 wait( ) / noftify( ) / notifyAll( )은 Object 클래스의 메서드이다.

** 이외의 메서드는 모두 Thread 클래스의 메서드이다.