java併發編程JUC第七篇:BlockingDeque雙端阻塞隊列

在之前的文章中已經爲大家介紹了java併發編程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、SynchronousQueue,本文爲系列文章第七篇。

Java併發編程JUC之BlockingQueue阻塞隊列

Java併發編程JUC之ArrayBlockingQueue

java併發編程JUC第三篇:DelayQueue延時隊列

java併發編程JUC第四篇:LinkedBlockingQueue

java併發編程JUC第五篇:PriorityBlockingQueue

java併發編程JUC第六篇:SynchronousQueue同步隊列

BlockingDeque接口和BlockingQueue 接口一樣都是在java.util.concurrent中定義的,它代表了一個線程安全的“雙端隊列”,以線程安全的方式向隊列中添加元素或獲取元素。本篇文章將帶大家進一步瞭解BlockingDeque

deque是 "Double Ended Queue "的縮寫。因此“雙端隊列”的含義就是可以從兩端(隊首或隊尾)插入和取出元素的隊列。

如果某個線程既生產又消費同一個隊列的元素,那麼就可以使用BlockingDeque雙端隊列。如果生產線程需要在隊列的兩端插入,而消費線程需要從隊列的兩端刪除,也可以只使用BlockingDeque雙端隊列。參考下面的圖進行理解

一個線程生產元素並將它們插入到隊列兩端中的任何一端。如果BlockingDeque當前是滿的,插入線程將被阻塞,直到移除線程從BlockingDeque中取出一個元素。如果BlockingDeque當前爲空,那麼移除線程將被阻塞,直到插入線程將一個元素插入到BlockingDeque中。

BlockingDeque 方法

BlockingDeque有4組不同的方法,用於插入、刪除和檢查deque中的元素。每組方法在所要求的操作不能被立即執行的情況下表現也有所不同。參考下面的表格

隊首操作 拋出異常 返回特定值 阻塞後一直等待 阻塞後等待超時
插入對象 addFirst(o) offerFirst(o) putFirst(o) offerFirst(o, timeout, timeunit)
移除對象 removeFirst(o) pollFirst() takeFirst() pollFirst(timeout, timeunit)
檢查對象存在 getFirst() peekFirst()

隊尾操作 拋出異常 返回特定值 阻塞後一直等待 阻塞後等待超時
插入對象 addLast(o) offerLast(o) putLast(o) offerLast(o, timeout, timeunit)
移除對象 removeLast(o) pollLast() takeLast() pollLast(timeout, timeunit)
檢查對象存在 getLast() peekLast()

大家可以看到,這些方法和和BlockingQueue 的方法有些相似,只是在方法的基礎上加了xxxFirst和xxxLast,所以可以參考我之前的文章對比學習),上面的方法的四種行爲分別的含義是

  1. 拋出異常:  如果調用方法後不能立即響應結果(空隊列或滿隊列),則拋出異常。
  2. 返回特定值:   如果調用方法後不能立即響應結果(空隊列或滿隊列),則返回特定的值(通常是true/false),true表示方法執行成功,否則表示方法執行失敗。
  3. 阻塞後一直等待:   如果調用方法後不能立即響應結果(空隊列或滿隊列),該方法將被阻塞一直處於等待狀態。
  4. 阻塞後等待超時:  如果調用方法後不能立即響應結果(空隊列或滿隊列),該方法將在一定時間範圍內被阻塞等待,也就是在超時時間範圍內阻塞。當超出超時時間之後,方法線程將不再阻塞,而是返回一個特定的值(通常是true/false),true表示方法執行成功,否則表示方法執行失敗。

BlockingDeque繼承BlockingQueue

BlockingDeque接口繼承了BlockingQueue接口。這意味着你可以將BlockingDeque作爲一個BlockingQueue使用。如果你這樣做,各種插入方法將把元素添加到deque的末尾,而移除方法將從deque的隊首移除元素。BlockingQueue接口的插入和刪除方法,就是這樣做的。

下面是BlockingQueue的方法在BlockingDeque實現中的作用對照表

BlockingQueue BlockingDeque
add() addLast()
offer() offerLast()
put() putLast()


remove() removeFirst()
poll pollFirst()
take() takeFirst()


element() getFirst()
peek() peekFirst()

BlockingDeque 接口實現類

BlockingDeque是一個接口,所以當我們真正對它進行實例化的時候,需要使用它的接口實現類。在java.util.concurrent包中的LinkedBlockingDeque方法實現了BlockingDeque接口。

其使用方法也與BlockingQueue 大同小異,所以此處只做簡單的介紹。

//初始化一個LinkedBlockingDeque
BlockingDeque<String> deque = new LinkedBlockingDeque<String>();

deque.addFirst("1");//向隊首添加元素
deque.addLast("2"); //向隊尾添加元素

String two = deque.takeLast(); //從隊尾獲取元素
String one = deque.takeFirst(); //從隊首獲取元素


本文分享自微信公衆號 - 字母哥課堂(zimug_blog)。
如有侵權,請聯繫 [email protected] 刪除。
本文參與“OSC源創計劃”,歡迎正在閱讀的你也加入,一起分享。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章