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()`는 스레드 간에 효율적으로 작업을 조율하고 특정 조건을 기다리거나 알리는 데 매우 중요한 메소드입니다.


관련 게시글

자바에서 병렬 처리를 구현하는 방법은 무엇인가요?

자바에서 병렬 처리는 여러 작업을 동시에 실행하여 프로그램의 성능과 응답성을 향상시키는 기법입니다....

문제 해결 및 면접 질문

문제 해결 및 면접 질문에 관한 글 --- 1. 문제 해결의 중요성 문제 해결 능력은 개인과...

자바에서 중복된 요소를 제거하는 방법은 무엇인가요?

자바(Java)에서 중복된 요소를 제거하는 방법에는 여러 가지가 있습니다. 주로 컬렉션프레임워크를 활용하...

자바 Collections에서 정렬하는 방법은 무엇인가요?

자바 Collections에서 정렬하는 방법에 대해 설명드리겠습니다. 자바에서는 컬렉션(Collection) 자료구조의...

자바의 메모리 누수 문제를 해결하는 방법은 무엇인가요?

자바의 메모리 누수 문제를 해결하는 방법 --- 1. 메모리 누수란? 자바는 가비지 컬렉션(GC)...

팩토리 패턴을 사용하여 주어진 문제를 해결해보세요.

팩토리 패턴을 사용하여 주어진 문제를 해결해보세요. --- 1. 팩토리 패턴이란? 팩토리 패턴...