Когда один поток создаёт задачи, а другой их обрабатывает, не хочется вручную писать wait, notify и синхронизацию вокруг списка.
Для такого сценария в Java есть BlockingQueue. Она сама умеет ждать элементы и блокировать запись, если очередь ограничена по размеру.
Сначала создадим очередь с лимитом:
BlockingQueue<String> queue = new ArrayBlockingQueue<>(100);
Producer может добавлять задачи через put:
queue.put("send-email");
queue.put("build-report");Если очередь заполнена, put подождёт свободное место. Это полезно, когда обработчик не успевает за входящим потоком задач.
Consumer забирает элементы через take:
String task = queue.take();
System.out.println(task);
Если очередь пустая, take будет ждать новый элемент. Поэтому не нужен бесконечный цикл с Thread.sleep и ручной проверкой size.
Часто worker запускают в отдельном потоке:
while (!Thread.currentThread().isInterrupted()) {
String task = queue.take();
handle(task);
}Для остановки можно использовать interrupt или специальную poison pill задачу. Главное, что обмен между потоками остаётся явным и контролируемым.
BlockingQueue хорошо подходит для фоновой обработки писем, логов, webhook-событий, небольших worker-пулов и простых producer-consumer задач.
👉 Java Ready | #практика