Ответ
Метод notify() (а также notifyAll() и wait()) определен в классе java.lang.Object.
Назначение: Эти методы используются для координации потоков (inter-thread communication) и должны вызываться только внутри синхронизированного контекста, когда текущий поток владеет монитором объекта.
Правила использования:
- Синхронизация: Вызов
notify()возможен только внутри блока или метода, синхронизированного на том же объекте (synchronized(obj)). - Пробуждение:
notify()пробуждает один произвольный поток, ожидающий на мониторе этого объекта (вызвавшийobj.wait()).notifyAll()пробуждает все такие потоки.
Пример шаблона "Producer-Consumer":
public class SharedBuffer {
private final Queue<String> queue = new LinkedList<>();
private final int MAX_SIZE = 5;
public synchronized void produce(String item) throws InterruptedException {
while (queue.size() == MAX_SIZE) {
wait(); // Освобождает монитор и ждет
}
queue.add(item);
notifyAll(); // Пробуждает потребителей
}
public synchronized String consume() throws InterruptedException {
while (queue.isEmpty()) {
wait(); // Освобождает монитор и ждет
}
String item = queue.poll();
notifyAll(); // Пробуждает производителей
return item;
}
}