12 阻塞佇列

2021-07-16 08:26:39 字數 2711 閱讀 1756

非阻塞佇列:priorityqueue

、linkedlist

(linkedlist

是雙向鍊錶,它實現了

dequeue

介面)

阻塞佇列:

(1)arrayblockingqueue:基於陣列實現的乙個阻塞佇列,在建立arrayblockingqueue

物件時必須制定容量大小。並且可以指定公平性與非公平性,預設情況下為非公平的,即不保證等待時間最長的佇列最優先能夠訪問佇列。

(2)linkedblockingqueue:基於鍊錶實現的乙個阻塞佇列,在建立linkedblockingqueue

物件時如果不指定容量大小,則預設大小為

integer.max_value。

(3)priorityblockingqueue:以上2

種佇列都是先進先出佇列,而

priorityblockingqueue

卻不是,它會按照元素的優先順序對元素進行排序,按照優先順序順序出隊,每次出隊的元素都是優先順序最高的元素。注意,此阻塞隊列為無界阻塞佇列,即容量沒有上限(通過原始碼就可以知道,它沒有容器滿的訊號標誌),前面

2種都是有界佇列。

(4)delayqueue:基於priorityqueue

,一種延時阻塞佇列,

delayqueue

中的元素只有當其指定的延遲時間到了,才能夠從佇列中獲取到該元素。

delayqueue

也是乙個無界佇列,因此往佇列中插入資料的操作(生產者)永遠不會被阻塞,而只有獲取資料的操作(消費者)才會被阻塞。

1.非阻塞佇列中的幾個主要方法:

add(e e):將元素e

插入到佇列末尾,如果插入成功,則返回

true

;如果插入失敗(即佇列已滿),則會丟擲異常;

remove():

移除隊首元素,若移除成功,則返回true

;如果移除失敗(隊列為空),則會丟擲異常;

offer(e e):

將元素e

插入到佇列末尾,如果插入成功,則返回

true

;如果插入失敗(即佇列已滿),則返回

false;

poll():

移除並獲取隊首元素,若成功,則返回隊首元素;否則返回null;

peek():

獲取隊首元素,若成功,則返回隊首元素;否則返回null

對於非阻塞佇列,一般情況下建議使用offer、

poll

和peek

三個方法,不建議使用add

和remove

方法。因為使用

offer

、poll

和peek

三個方法可以通過返回值判斷操作成功與否,而使用

add和

remove

方法卻不能達到這樣的效果。注意,非阻塞佇列中的方法都沒有進行同步措施。

2.阻塞佇列中的幾個主要方法:

阻塞佇列包括了非阻塞佇列中的大部分方法,上面列舉的5

個方法在阻塞佇列中都存在,但是要注意這

5個方法在阻塞佇列中都進行了同步措施。除此之外,阻塞佇列提供了另外

4個非常有用的方法:

put(e e)     用來向隊尾存入元素,如果佇列滿,則等待;

take()       用來從隊首取元素,如果隊列為空,則等待;

offer(e e,long timeout, timeunit unit)    用來向隊尾存入元素,如果佇列滿,則等待一定的時間,當時間期限達到時,如果還沒有插入成功,則返回false

;否則返回

true

poll(long timeout, timeunit unit)        用來從隊首取元素,如果佇列空,則等待一定的時間,當時間期限達到時,如果取到,則返回null

;否則返回取得的元素;

arrayblockingqueue中用來儲存元素的實際上是乙個陣列,takeindex和

putindex

分別表示隊首元素和隊尾元素的下標,

count

表示佇列中元素的個數。

從put方法

的實現可以看出,它先獲取了鎖,並且獲取的是可中斷鎖,然後判斷當前元素個數是否等於陣列的長度,如果相等,則呼叫notfull.await()

進行等待,如果捕獲到中斷異常,則喚醒執行緒notfull.signal();

並丟擲異常。

當被其他執行緒喚醒時(經過take操作,其中extract方法取的元素後喚醒notfull.signal()),通過insert(e)

方法插入元素,最後解鎖。插入成功後,通過notempty喚醒正在等待取元素的執行緒。

take方法

跟put

方法實現很類似,只不過

put方法等待的是

notfull

訊號,而

take

方法等待的是

notempty

訊號。在

take

方法中,如果為null則notempty.await()如果可以取元素,則通過

extract

方法取得元素,然後喚醒notfull。執行notfull.signal()

生產者消費者_wait,notify,notifyall

生產者消費者_

阻塞佇列實現

等待佇列 阻塞非阻塞

阻塞 裝置驅動不阻塞,使用者想獲取裝置資源只能不停的查詢,這無謂的消耗cpu資源。而阻塞訪問,不能獲取資源的程序將進入休眠,它將cpu資源 禮讓 給其他程序 喚醒程序的地方最大可能發生在中斷裡面,因為硬體資源獲得的同時往往伴隨著乙個中斷 定義頭 wait queue head t queue 初始化...

阻塞佇列BlockingQueue

例介紹乙個特殊的佇列 blockingqueue,如果blockingqueue是空的,從blockingqueue取東西的操作將會被阻斷進入等待狀態,直到blockingqueue進了東西才會被喚醒,同樣,如果blockingqueue是滿的,任何試圖往裡存東西的操作也會被阻斷進入等待狀態,直到b...

java阻塞佇列

1.介紹 乙個支援兩個附加操作的佇列,兩個附加的操作支援阻塞的插入和移除操作。在阻塞佇列不可用時,兩個附加操作提供了4種處理方式 丟擲異常 返回特殊值 一直阻塞和超時退出。jdk7提供了7個阻塞佇列 1.arrayblockingqueue 陣列結構組成的有界阻塞佇列 預設情況下不保證執行緒公平的訪...