非阻塞佇列: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 陣列結構組成的有界阻塞佇列 預設情況下不保證執行緒公平的訪...