在之前的文章中已經為大家介紹了java並發編程的工具:BlockingQueue接口、ArrayBlockingQueue、DelayQueue、LinkedBlockingQueue、PriorityBlockingQueue、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,所以可以參考我之前的文章對比學習),上面的方法的四種行為分別的含義是
- 拋出異常: 如果調用方法后不能立即響應結果(空隊列或滿隊列),則拋出異常。
- 返回特定值: 如果調用方法后不能立即響應結果(空隊列或滿隊列),則返回特定的值(通常是true/false),true表示方法執行成功,否則表示方法執行失敗。
- 阻塞后一直等待: 如果調用方法后不能立即響應結果(空隊列或滿隊列),該方法將被阻塞一直處於等待狀態。
- 阻塞后等待超時: 如果調用方法后不能立即響應結果(空隊列或滿隊列),該方法將在一定時間范圍內被阻塞等待,也就是在超時時間范圍內阻塞。當超出超時時間之后,方法線程將不再阻塞,而是返回一個特定的值(通常是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(); //從隊首獲取元素
歡迎關注我的博客,里面有很多精品合集
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客。
覺得對您有幫助的話,幫我點贊、分享!您的支持是我不竭的創作動力! 。另外,筆者最近一段時間輸出了如下的精品內容,期待您的關注。