Короткий ответ
BlockingQueue — интерфейс из пакета java.util.concurrent, описывающий потокобезопасную очередь с блокирующими операциями: put() ждёт, пока в заполненной очереди освободится место, а take() ждёт появления элемента в пустой. Это готовая модель «производитель — потребитель», которая избавляет от ручной синхронизации через wait/notify.
Как это работает подробнее
Блокирующие операции приостанавливают поток до выполнения условия: put() не завершится, пока в ограниченной очереди не освободится место, а take() — пока не появится элемент. Помимо них есть неблокирующие offer() и poll(): они сразу возвращают false или null, а версии с таймаутом ждут строго ограниченное время.
Интерфейс избавляет от ручной синхронизации: не нужны ни явные блокировки, ни wait/notify, ни бесконечные циклы опроса. Очередь сама координирует потоки производителя и потребителя.
- ArrayBlockingQueue — ограниченная очередь на массиве с фиксированной ёмкостью.
- LinkedBlockingQueue — очередь на связных узлах, опционально ограниченная.
- PriorityBlockingQueue — элементы извлекаются по приоритету.
- SynchronousQueue — очередь без буфера: каждый
put()ждёт парногоtake().
Пример кода
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
public class BlockingQueueDemo {
public static void main(String[] args) throws Exception {
BlockingQueue<String> queue = new ArrayBlockingQueue<>(2);
queue.put("task-1");
queue.put("task-2"); // очередь заполнена
new Thread(() -> {
try {
Thread.sleep(200);
System.out.println("Consumer: " + queue.poll());
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}).start();
queue.put("task-3"); // блокируется, пока не освободится место
System.out.println("Producer: task-3 добавлен");
}
}