java阻塞佇列

2021-08-20 14:37:13 字數 1445 閱讀 6103

1.介紹:

乙個支援兩個附加操作的佇列,兩個附加的操作支援阻塞的插入和移除操作。

在阻塞佇列不可用時,兩個附加操作提供了4種處理方式:丟擲異常、返回特殊值、一直阻塞和超時退出。

jdk7提供了7個阻塞佇列:『

1.arrayblockingqueue:陣列結構組成的有界阻塞佇列

預設情況下不保證執行緒公平的訪問佇列,保證公平性會降低吞吐量。訪問者的公平性是使用重入鎖實現的。

2.linkedblockingqueue:鍊錶結構組成的有界阻塞佇列

按照先進先出的原則對元素進行排序。

3.priorityblockingqueue:支援優先順序排序的無界阻塞佇列

預設情況下,元素採用自然順序公升序排列,但不能保證同優先順序元素的排序。

4.delayqueue:使用優先順序佇列實現的無界阻塞佇列

佇列使用priorityqueue來實現,佇列中的元素必須實現delayed介面。

1.在物件建立的時候,初始化基本資料。

2.實現getdelay方法,該方法返回當前元素還需要延時多長時間,單位是納秒。

3.實現compareto()方法來指定元素的順序。

使用場景:

1.快取系統的設計

2.定時任務排程

5.synchronousqueue:不儲存元素的阻塞佇列

每乙個put操作必須等待乙個take操作,否則不能繼續新增元素。他可看成乙個傳球手,生產者的資料傳送給消費者執行緒。吞吐量高於linkedblockingqueue和arrayblockingqueue。

6.linkedtransferqueue:鍊錶結構組成的無界阻塞transferqueue佇列。相對於其他阻塞佇列,多了trytransfer和transfer方法。trytransfer方法無論消費者是否接收,方法立即返回,而transfer方法是必須等到消費者消費了才返回。除了超時機制。

7.linkedblockingqueue:鍊錶結構組成的雙向阻塞佇列,在多執行緒同時入隊時減少了一半的競爭。add方法等同於addlast,remove方法等同於removefirst,take等同於takefirst.可以運用在「工作竊取」中。

使用通知模式實現:arrayblockingqueue使用了condition來實現。插入乙個元素時佇列不可用,阻塞生產者主要通過locksupport.park(this)來實現。park(this)的原始碼是用setblocker先儲存一下將要阻塞的執行緒,然後呼叫unsafe.park阻塞當前執行緒。unsafe。park原始碼如下;

public native void park(boolean isabsolute,long time);

注:相對時間是時間間隔,後面引數單位為納秒,絕對時間是時間點,後面引數單位是毫秒。看看jvm中如何實現park方法:linux下實現系統方法pthread_cond_wait實現,在windows下是使用waitforsingleobject實現的。

java常用阻塞佇列

blockingqueue 獲取元素的時候等待佇列裡有元素,否則阻塞 儲存元素的時候等待佇列裡有空間,否則阻塞 用來簡化生產者消費者在多執行緒環境下的開發 arrayblockingqueue fifo 陣列實現 有界阻塞佇列,一旦指定了佇列的長度,則佇列的大小不能被改變 在生產者消費者例子中,如果...

java中的阻塞佇列

一 阻塞佇列 blockingqueue 是乙個支援兩個附加操作的佇列。這兩個附加的操作支援阻塞的插入和移除方法。1 支援阻塞的插入方法 意思是當佇列滿時,佇列會阻塞插入元素的執行緒,直到佇列不滿。2 支援阻塞的移除方法 意思是在隊列為空時,獲取元素的執行緒會等待佇列變為非空。阻塞佇列常用於生產者和...

java 阻塞佇列自定義實現

自定義阻塞佇列 思路 阻塞佇列有這樣乙個特點,當佇列中沒有值得時候,這是只允許值得插入,當佇列中有值得時候,這時候允許佇列的插入,同時也允許佇列中元素的移除,但是當佇列中沒有值得時候,這時候就不允許佇列的移除了,而是等待其他執行緒插入新的元素 public class blockingqueue 如...