阻塞佇列BlockingQueue使用

2021-07-24 04:01:01 字數 1935 閱讀 7876

blockingqueue的原理及方法: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++)

}}

執行結果:

放入雞蛋

放入雞蛋

放入雞蛋

拿到雞蛋

拿到雞蛋

拿到雞蛋

放入雞蛋

拿到雞蛋

放入雞蛋

拿到雞蛋

放入雞蛋

放入雞蛋

拿到雞蛋

放入雞蛋

拿到雞蛋

放入雞蛋

拿到雞蛋

放入雞蛋

拿到雞蛋

拿到雞蛋

併發工具包 阻塞佇列BlockingQueue

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

等待佇列 阻塞非阻塞

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

阻塞佇列BlockingQueue

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