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 的一些常見實現是:

  1. ArrayBlockingQueue
  2. 的 LinkedBlockingQueue
  3. 的 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

並且在第二次輸出後執行緒將被阻塞。