Wait와 Notify 메소드는 어떻게 사용하나요?
Wait와 Notify 메소드는 자바(Java)에서 스레드 간의 통신을 위해 Object 클래스에 정의된 메소드입니다.
주로 스레드가 어떤 조건을 기다리거나, 특정 조건이 충족되었을 때 다른 스레드를 깨우기 위해 사용됩니다.
이 메소드들은 동기화(synchronization) 블록 혹은 메소드 내에서 호출되어야 하며, 그렇지 않으면 IllegalMonitorStateException이 발생합니다.
1. 기본 개념 - `wait()`: 현재 스레드를 일시 정지 상태로 만들고, 다른 스레드가 `notify()` 또는 `notifyAll()`을 호출할 때까지 기다립니다.
- `notify()`: 대기 중인 스레드 중 하나를 깨워서 실행 가능 상태로 만듭니다.
- `notifyAll()`: 대기 중인 모든 스레드를 깨웁니다.
2. 사용 예제 ```java class SharedResource { private boolean condition = false; public synchronized void waitForCondition() { while (!condition) { try { wait(); // condition이 true가 될 때까지 기다림 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } // condition이 true인 경우에 실행할 코드 System.out.println("Condition met, proceeding..."); } public synchronized void changeCondition() { condition = true; notify(); // 기다리고 있는 스레드 중 하나를 깨움 } } public class WaitNotifyExample { public static void main(String[] args) { SharedResource shared = new SharedResource(); Thread waitingThread = new Thread(() -> { shared.waitForCondition(); }); Thread notifyingThread = new Thread(() -> { try { Thread.sleep(1000); // 1초 대기 후 condition 변경 } catch (InterruptedException e) { Thread.currentThread().interrupt(); } shared.changeCondition(); }); waitingThread.start(); notifyingThread.start(); } } ``` 3. 주의사항 - `wait()`, `notify()`, `notifyAll()` 메소드는 반드시 `synchronized` 블록이나 메소드 내에서 호출되어야 합니다.
- `wait()` 호출 후 스레드는 `notify()`가 호출될 때까지 대기 상태가 되며, `notify()` 호출 시 대기 중인 스레드 중 하나가 깨어나 실행 대기 상태가 됩니다.
- 복수 스레드가 대기 중일 경우 `notify()`는 그 중 하나만 깨우므로, 모든 대기 스레드를 깨우려면 `notifyAll()`을 사용해야 합니다.
- `wait()`는 인터럽트에 의해 깨울 수 있으므로 반드시 `InterruptedException` 처리를 해주어야 합니다.
4. 요약 | 메소드 | 동작 | 호출 조건 | |------------|-----------------------------------------------|-------------------------------------| | `wait()` | 현재 스레드를 일시 정지 상태로 만들고 대기함 | `synchronized` 블록 내에서 호출해야 함 | | `notify()` | 대기 중인 스레드 중 하나를 깨워서 실행 대기 상태로 만듦 | `synchronized` 블록 내에서 호출해야 함 | | `notifyAll()` | 대기 중인 모든 스레드를 깨움 | `synchronized` 블록 내에서 호출해야 함 | --- 이처럼 `wait()`와 `notify()`는 스레드 간에 효율적으로 작업을 조율하고 특정 조건을 기다리거나 알리는 데 매우 중요한 메소드입니다.