blockingqueue的原理及方法:blockingqueue最終會有四種狀況,丟擲異常、返回特殊值、阻塞、超時,下表總結了這些方法:
1. arrayblockqueue:乙個由陣列支援的有界阻塞佇列。此佇列按 fifo(先進先出)原則對元素進行排序。建立其物件必須明確大小,像陣列一樣。丟擲異常
特殊值阻塞
超時插入
add(e)
offer(e)
put(e)
offer(e, time, unit)
移除
remove()
poll()
take()
poll(time, unit)
檢查
element()
peek()
不可用不可用
blockingqueue是個介面,有如下實現類:
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...