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

2021-09-29 20:48:26 字數 2109 閱讀 3898

queue佇列:先進先出,兩個執行緒同時操作同乙個佇列,執行緒是不安全的

blockingqueue阻塞佇列:先進先出,執行緒是安全,阻塞佇列中維護了鎖,用於進出佇列。一般阻塞佇列用於生產者和消費者模式。

arrayblockingqueue:

(1)基於陣列的阻塞佇列。

(2)維護的是定長陣列,初始化的時候,必須指定值。

(3)維護的一把鎖,進出佇列用的是一把鎖。

(4)在生產和消費的時候,不會產生和銷毀額外的物件。

linkedblockingqueue

(1)基於鍊錶的阻塞佇列。

(2)預設無限大,可指定大小integer.max_value。

(3)維護的是兩把鎖,進出佇列分別用一把鎖。

(4)在生產和消費的時候,需要建立node物件進行插入或移除,大批量資料的系統中,其對於gc的壓力會比較大。

對於linkedblockingqueue佇列,如果不指定大小,當生產者的速度大於消費者速度,不會產生阻塞,系統記憶體就會被消耗殆盡。

1.放入資料

(1)offer(anobject):表示如果可能的話,將anobject加到blockingqueue裡,即如果blockingqueue可以容納,則返回true,否則返回false.(本方法不阻塞當前執行方法 的執行緒);      

(2)offer(e o, long timeout, timeunit unit):可以設定等待的時間,如果在指定的時間內,還不能往佇列中加入blockingqueue,則返回失敗。

(3)put(anobject):當佇列中填滿資料的情況下,生產者端的所有執行緒都會被自動阻塞(掛起),直到佇列中有空的位置,執行緒被自動喚醒。

2. 獲取資料

(1)poll(time):取走blockingqueue裡排在首位的物件,若不能立即取出,則可以等time引數規定的時間,取不到時返回null;

(2)poll(long timeout, timeunit unit):從blockingqueue取出乙個隊首的物件,如果在指定時間內,佇列一旦有資料可取,則立即返回佇列中的資料。否則知道時間超時還沒有資料可取,返回失敗。

(3)take():當佇列中沒有資料的情況下,消費者端的所有執行緒都會被自動阻塞(掛起),直到有資料放入佇列。

(4)drainto():一次性從blockingqueue獲取所有可用的資料物件(還可以指定獲取資料的個數),通過該方法,可以提公升獲取資料效率;不需要多次分批加鎖或釋放鎖。

消費者消費資料:

@component

public class blockingqueuetask

public void excute() ", user);

deal(user);

log.info("佇列結束end");

} catch (interruptedexception e) catch (jsonprocessingexception e2)

}, 0, 1, timeunit.minutes);

}/**

* 向阻塞佇列中增加資料

** @param user

* @throws interruptedexception

*/public void addqueue(user user) throws interruptedexception

/*** 處理佇列資料

** @param user

*/private void deal(user user) throws jsonprocessingexception

生產者生產資料:

@autowired

blockingqueuetask blockingqueuetask;

@apioperation(value = "向阻塞佇列中新增資料", notes = "向阻塞佇列中新增資料")

public void addqueue(@requestbody user user)throws interruptedexception

多執行緒 阻塞佇列

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 不僅可以...

多執行緒 阻塞佇列

1 當佇列滿的時候,插入元素的執行緒被阻塞,直達佇列不滿。2 隊列為空的時候,獲取元素的執行緒被阻塞,直到佇列不空。生產者就是生產資料的執行緒,消費者就是消費資料的執行緒。在多執行緒開發中,如果生產者處理速度很快,而消費者處理速度很慢,那麼生產者就必須等待消費者處理完,才能繼續生產資料。同樣的道理,...