BlockingQueue
BlockingQueue 是一個介面,它是一個佇列,當你嘗試從佇列中出隊並且佇列為空時阻塞,或者如果你嘗試將專案排入佇列且佇列已滿。嘗試從空佇列中出隊的執行緒被阻塞,直到某個其他執行緒將專案插入佇列。嘗試將完整佇列中的項排入佇列的執行緒將被阻塞,直到某個其他執行緒在佇列中建立空間,方法是將一個或多個專案出列或完全清除佇列。
BlockingQueue 方法有四種形式,有不同的處理操作方式,不能立即滿足,但可能在將來的某個時候得到滿足:一個丟擲異常,第二個返回一個特殊值(null 或 false,取決於操作),第三個無限期地阻塞當前執行緒直到操作成功,並且第四個塊在放棄之前僅用於給定的最大時間限制。
操作 | 丟擲異常 | 特殊值 | Blocks | 超時 |
---|---|---|---|---|
插入 | add() | offer(e) | put(e) | offer(e, time, unit) |
刪除 | remove() | poll(e) | take() | poll(time, unit) |
檢查 | element() | peek() | N/A | N/ A |
BlockingQueue
可以是有界的或無界的。有界 BlockingQueue 是初始化初始容量的 BlockingQueue。
BlockingQueue<String> bQueue = new ArrayBlockingQueue<String>(2);
如果佇列的大小等於定義的初始容量,則將阻止對 put()
方法的任何呼叫。
無界佇列是一個沒有容量初始化的佇列,實際上預設情況下是用 Integer.MAX_VALUE 初始化的。
BlockingQueue
的一些常見實現是:
- ArrayBlockingQueue
- 的 LinkedBlockingQueue
- 的 PriorityBlockingQueue
現在讓我們看一下 ArrayBlockingQueue
的一個例子:
BlockingQueue<String> bQueue = new ArrayBlockingQueue<>(2);
bQueue.put("This is entry 1");
System.out.println("Entry one done");
bQueue.put("This is entry 2");
System.out.println("Entry two done");
bQueue.put("This is entry 3");
System.out.println("Entry three done");
這將列印:
Entry one done
Entry two done
並且在第二次輸出後執行緒將被阻塞。