阻塞佇列 BlockingQueue 享學課堂

2021-10-01 03:31:00 字數 2441 閱讀 4936

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元素稱為出隊。因為佇列只允許在一端插入,在另一端刪除,所以只有最早進入佇列的元素才能最先從佇列中刪除,故佇列又稱為先進先出(fifo—first in first out)線性表。

什麼是阻塞佇列

常用阻塞佇列

arrayblockingqueue:乙個由陣列結構組成的有界阻塞佇列。

linkedblockingqueue:乙個由鍊錶結構組成的有界阻塞佇列。

priorityblockingqueue:乙個支援優先順序排序的無界阻塞佇列。

delayqueue:乙個使用優先順序佇列實現的無界阻塞佇列。

synchronousqueue:乙個不儲存元素的阻塞佇列。

linkedtransferqueue:乙個由鍊錶結構組成的無界阻塞佇列。

linkedblockingdeque:乙個由鍊錶結構組成的雙向阻塞佇列。

有界無界
有限佇列就是長度有限,滿了以後生產者會阻塞,無界佇列就是裡面能放無數的東西而不會因為佇列長度限制被阻塞,當然空間限制**於系統資源的限制,如果處理不及時,導致佇列越來越大越來越大,超出一定的限制致使記憶體超限,作業系統或者 jvm 幫你解決煩惱,直接把你 oom kill 省事了。

arrayblockingqueue
是乙個用陣列實現的有界阻塞佇列。此佇列按照先進先出(fifo)的原則對元素進行排序。預設情況下不保證執行緒公平的訪問佇列,所謂公平訪問佇列是指阻塞的執行緒,可以按照阻塞的先後順序訪問佇列,即先阻塞執行緒先訪問佇列。非公平性是對先等待的執行緒是非公平的,當佇列可用時,阻塞的執行緒都可以爭奪訪問佇列的資格,有可能先阻塞的執行緒最後才訪問佇列。初始化時有引數可以設定

linkedblockingqueue
是乙個用鍊錶實現的有界阻塞佇列。此佇列的預設和最大長度為integer.max_value。此佇列按照先進先出的原則對元素進行排序。

array 實現和 linked 實現的區別
佇列中鎖的實現不同

arrayblockingqueue 實現的佇列中的鎖是沒有分離的,即生產和消費用的是同乙個鎖;

linkedblockingqueue 實現的佇列中的鎖是分離的,即生產用的是 putlock,消費是 takelock

在生產或消費時操作不同

arrayblockingqueue 實現的佇列中在生產和消費的時候,是直接將列舉物件插入或移除的;

linkedblockingqueue 實現的佇列中在生產和消費的時候,需要把列舉物件轉換為 node進行插入或移除,會影響效能

佇列大小初始化方式不同

arrayblockingqueue 實現的佇列中必須指定佇列的大小;

linkedblockingqueue 實現的佇列中可以不指定佇列的大小,但是預設是integer.max_value

priorityblockingqueue
priorityblockingqueue 是乙個支援優先順序的無界阻塞佇列。預設情況下元素採取自然順序公升序排列。也可以自定義類實現 compareto()方法來指定元素排序規則,或者初始化 priorityblockingqueue 時,指定構造引數 comparator 來對元素進行排序。需要注意的是不能保證同優先順序元素的順序。

delayqueue
是乙個不儲存元素的阻塞佇列。每乙個 put 操作必須等待乙個 take 操作,否則不能繼續新增元素。synchronousqueue 可以看成是乙個傳球手,負責把生產者執行緒處理的資料直接傳遞給消費者執行緒。佇列本身並不儲存任何元素,非常適合傳遞性場景。synchronousqueue 的吞吐量高於 linkedblockingqueue 和arrayblockingqueue。

了解阻塞佇列的實現原理
是乙個支援延時獲取元素的無界阻塞佇列。佇列使用 priorityqueue 來實現。佇列中的元素必須實現 delayed 介面,在建立元素時可以指定多久才能從佇列中獲取當前元素。只有在延遲期滿時才能從佇列中提取元素。

delayqueue 非常有用,可以將 delayqueue 運用在以下應用場景:

快取系統的設計:可以用 delayqueue 儲存快取元素的有效期,使用乙個執行緒迴圈查詢 delayqueue,一旦能從delayqueue 中獲取元素時,表示快取有效期到了。還有訂單到期,限時支付等等。

併發工具包 阻塞佇列BlockingQueue

阻塞佇列,顧名思義 如果佇列滿了,那麼會進入阻塞狀態,當有消費者從佇列中取出資料後,再解除阻塞狀態。如果隊列為空,從佇列中取資料就會進入阻塞狀態。直至佇列中有資料為止。blockingqueue是介面,目前已知的實現類如下 arrayblockingqueue 底層底層通過陣列來儲存佇列中的元素,所...

等待佇列 阻塞非阻塞

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

阻塞佇列BlockingQueue

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