Очереди wait/notify в BlockingQueue
Замените написанную вручную координацию производитель-потребитель на BlockingQueue.
Сравнение кода
✕ Manual wait and notify
synchronized (queue) {
while (queue.isEmpty()) {
queue.wait();
}
Job job = queue.removeFirst();
process(job);
}
✓ BlockingQueue
BlockingQueue<Job> queue = new LinkedBlockingQueue<>(); Job job = queue.take(); process(job);
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Более безопасная координация
Очередь берёт на себя блокировку и сигнализацию условий.
Ясное намерение
put() и take() напрямую выражают поведение производитель-потребитель.
Встроенные политики
Выбирайте ограниченную ёмкость, справедливость, тайм-ауты или неблокирующие операции.
Старый подход
Ручные wait и notify
Современный подход
BlockingQueue
Начиная с JDK
5
Сложность
Средний
Поддержка JDK
Очереди wait/notify в BlockingQueue
Доступно
Широко доступно с JDK 5 (2004)
Как это работает
Корректный код wait/notify требует общего монитора, циклов проверки условия, соответствующих уведомлений и аккуратной обработки прерываний. BlockingQueue инкапсулирует эти правила и предоставляет блокирующие, ограниченные по времени и неблокирующие операции для схем производитель-потребитель. Вызовы вроде put() и take() остаются прерываемыми.
Связанная документация
Доказательство