多執行緒 阻塞佇列

2021-09-16 13:54:51 字數 2138 閱讀 3035

1)當佇列滿的時候,插入元素的執行緒被阻塞,直達佇列不滿。

2)隊列為空的時候,獲取元素的執行緒被阻塞,直到佇列不空。

生產者就是生產資料的執行緒,消費者就是消費資料的執行緒。在多執行緒開發中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,如果消費者的處理能力大於生產者,那麼消費者就必須等待生產者。為了解決這種生產消費能力不均衡的問題,便有了生產者和消費者模式。生產者和消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而是通過阻塞佇列來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給阻塞佇列,消費者不找生產者要資料,而是直接從阻塞佇列裡取,阻塞佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。

方法丟擲異常

返回值一直阻塞

超時退出

插入方法

addoffer

putoffer(time)

移除方法

remove

poll

take

poll(time)

檢查方法

element

peek

n/an/a

丟擲異常:當佇列滿時,如果再往佇列裡插入元素,會丟擲illegalstateexception("queuefull")異常。當佇列空時,從佇列裡獲取元素會丟擲nosuchelementexception異常。

返回特殊值:當往佇列插入元素時,會返回元素是否插入成功,成功返回true。如果是移除方法,則是從佇列裡取出乙個元素,如果沒有則返回null。

一直阻塞:當阻塞佇列滿時,如果生產者執行緒往佇列裡put元素,佇列會一直阻塞生產者執行緒,直到佇列可用或者響應中斷退出。當佇列空時,如果消費者執行緒從佇列裡take元素,佇列會阻塞住消費者執行緒,直到佇列不為空。

超時退出:當阻塞佇列滿時,如果生產者執行緒往佇列裡插入元素,佇列會阻塞生產者執行緒一段時間,如果超過了指定的時間,生產者執行緒就會退出。

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

按照先進先出原則,要求設定初始大小

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

按照先進先出原則,可以不設定初始大小,integer.max_value

arrayblockingqueue和linkedblockingqueue不同:

鎖上面:arrayblockingqueue只有乙個鎖,linkedblockingqueue用了兩個鎖,

實現上:arrayblockingqueue直接插入元素,linkedblockingqueue需要轉換。

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

預設情況下,按照自然順序,要麼實現compareto()方法,指定構造引數comparator

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

支援延時獲取的元素的阻塞佇列,元素必須要實現delayed介面。適用場景:實現自己的快取系統,訂單到期,限時支付等等。

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

每乙個put操作都要等待乙個take操作

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

transfer(),必須要消費者消費了以後方法才會返回,trytransfer()無論消費者是否接收,方法都立即返回。

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

可以從佇列的頭和尾都可以插入和移除元素,實現工作密取,方法名帶了first對頭部操作,帶了last從尾部操作,另外:add=addlast; remove=removefirst;     take=takefirst

比如,arrayblockingqueue就是基於lock和condition實現的。

多執行緒 阻塞佇列

blockingqueue最終會有四種狀況,丟擲異常 返回特殊值 阻塞 超時,下表總結了這些方法 丟擲異常 特殊值阻塞 超時插入add e offer e put e offer e,time,unit 移除remove poll take poll time,unit 檢查element peek...

執行緒通訊 阻塞佇列

1 blockingqueue 阻塞佇列 當生產者試圖向blockingqueue中放入元素時,如果該佇列已滿,則該執行緒被阻塞,當消費者試圖從佇列中取出元素,當隊列為空時阻塞。主要方法 1 法向blockingqueue中插入null,否則丟擲nullpointerexception 2 不僅可以...

執行緒安全的佇列 阻塞佇列

queue佇列 先進先出,兩個執行緒同時操作同乙個佇列,執行緒是不安全的 blockingqueue阻塞佇列 先進先出,執行緒是安全,阻塞佇列中維護了鎖,用於進出佇列。一般阻塞佇列用於生產者和消費者模式。arrayblockingqueue 1 基於陣列的阻塞佇列。2 維護的是定長陣列,初始化的時候...