○ 스레드 간 협업( 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( ) 메서드를 호출해 일시 정지로 만들어버립니다.
'Programming > JAVA' 카테고리의 다른 글
멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 3 (0) | 2024.12.09 |
---|---|
멀티 스레드(6) - 스레드 상태 제어 5 : 스레드 간 협업 2 (4) | 2024.12.07 |
멀티 스레드(6) - 스레드 상태 제어 4 (2) | 2024.11.28 |
멀티 스레드(6) - 스레드 상태 제어 3 (0) | 2024.11.26 |
멀티 스레드(6) - 스레드 상태 제어 2 (1) | 2024.11.25 |