多執行緒 阻塞佇列

2021-07-10 13:18:00 字數 1652 閱讀 4904

blockingqueue最終會有四種狀況,丟擲異常、返回特殊值、阻塞、超時,下表總結了這些方法:

丟擲異常

特殊值阻塞

超時插入add(e)

offer(e)

put(e)

offer(e, time, unit)

移除remove()

poll()

take()

poll(time, unit)

檢查element()

peek()

不可用不可用

blockingqueue是個介面,有如下實現類:

1. arrayblockqueue:乙個由陣列支援的有界阻塞佇列。此佇列按 fifo(先進先出)原則對元素進行排序。建立其物件必須明確大小,像陣列一樣。

2. linkedblockqueue:乙個可改變大小的阻塞佇列。此佇列按 fifo(先進先出)原則對元素進行排序。建立其物件如果沒有明確大小,預設值是integer.max_value。鏈結佇列的吞吐量通常要高於基於陣列的佇列,但是在大多數併發應用程式中,其可預知的效能要低。 

3. priorityblockingqueue:類似於linkedblockingqueue,但其所含物件的排序不是fifo,而是依據物件的自然排序順序或者是建構函式所帶的comparator決定的順序。

4. synchronousqueue:同步佇列。同步佇列沒有任何容量,每個插入必須等待另乙個執行緒移除,反之亦然。

下面使用arrayblockqueue來實現之前實現過的生產者消/費者模式,**如下:

/** 定義乙個盤子類,可以放雞蛋和取雞蛋 */

public class bigplate catch (interruptedexception e)

// 下面輸出有時不準確,因為與put操作不是乙個原子操作

system.out.println("放入雞蛋"); }

/** 取雞蛋 */

public object getegg() catch (interruptedexception e)

// 下面輸出有時不準確,因為與take操作不是乙個原子操作

system.out.println("拿到雞蛋");

return egg; }

/** 放雞蛋執行緒 */

static class addthread extends thread

public void run()

} /** 取雞蛋執行緒 */

static class getthread extends thread

public void run() }

public static void main(string args)

// 再啟動10個取雞蛋執行緒

for(int i = 0; i < 10; i++)

}}

多執行緒 阻塞佇列

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

執行緒通訊 阻塞佇列

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

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

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