본문 바로가기

Programming/JAVA

멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 1

 

 

 

 

○ 스레드 간 협업( wait( ), notify( ), notifyAll( ) )

 

경우에 따라 두 개의 스레드를 번갈아 교대로 실행할 필요성이 생길때가 있습니다. 정확한 교대 규칙이 필요할 경우, 자신의 작업이 끝나면 상대방 스레드를 일시 정지 상태에서 풀고 - 자신은 일시 정지 상태로 만들면 됩니다. 

 

여기서 wait( ) / notify( ) / notifyAll( )이 사용되는데, 설명이 복잡할 수 있으니 메서드 표를 다시 한번 인용해 보겠습니다.

 

 

 

 

 

 

동작 메서드 설명
일시 정지 > 실행 대기 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 클래스의 메서드이다.

 

 


 

 

· 기본적으로 wait( ) / notify( ) / notifyAll( ) 사용은 synchronized(동기화) 메서드나 블록 내에서만 사용 가능합니다. 이후의 설명은 이를 전제로 하고 이루어집니다.

 

· 공유 객체가 핵심입니다. 각각의 스레드가 공유하는 이 공유 객체에는, 두 스레드가 작업할 내용을 각각의 동기화 메서드로 구분해 놓습니다. 각각의 메서드에는 notify( )와 wait( )를 실행하죠.

 

· 한 스레드가 작업이 끝나면 notify( )를 호출해서 다른 스레드를 실행 대기 상태로 만듭니다. 그리고 자신은 wait( ) 메서드를 호출해 일시 정지로 만들어버립니다.