BlockingQueue 繼承 Queue,提供阻塞語義:
poll(timeout):帶超時版本天然適合「生產者-消費者」模式,無需手動 wait/notify。
| 實現類 | 特點 | 適用場景 |
|---|---|---|
| ArrayBlockingQueue | 有界數組,FIFO | 固定大小緩存、任務隊列 |
| LinkedBlockingQueue | 可選有界鏈表,FIFO | 高吞吐生產消費、無界緩存 |
| PriorityBlockingQueue | 優先級排序,無界 | 優先級任務調度 |
| DelayQueue | 延遲執行,無界 | 定時任務、緩存過期清理 |
| SynchronousQueue | 無容量,直接移交 | 線程間直接傳遞、CachedThreadPool |
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ArrayBlockingQueue;
public class Test {
public static void main(String[] args) throws InterruptedException {
BlockingQueue bqueue = new ArrayBlockingQueue<>(20);
for (int i = 0; i < 30; i++) {
bqueue.put(i); // 滿後阻塞
System.out.println("向阻塞隊列中添加了元素:" + i);
}
System.out.println("程序到此運行結束,即將退出----");
}
}
向阻塞隊列中添加了元素:0
...
向阻塞隊列中添加了元素:19
// 程序阻塞於 put(20),因隊列已滿無消費者
第20個元素 (索引19) 入隊後,隊列滿 (容量20),第21次 put() 永久阻塞。
BlockingQueue queue = new LinkedBlockingQueue<>(100);
// 生產者
new Thread(() -> {
while (running) {
Task task = produce();
queue.put(task); // 自動阻塞等待空位
}
}).start();
// 消費者
new Thread(() -> {
while (running) {
Task task = queue.take(); // 自動阻塞等待任務
consume(task);
}
}).start();
drainTo 等)