生產者 消費者 BlockingQueue

2021-05-28 01:44:11 字數 1223 閱讀 8996

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

本例再次實現前面介紹的籃子程式,不過這個籃子中最多能放得蘋果數不是1,可以隨意指定。當籃子滿時,生產者進入等待狀態,當籃子空時,消費者等待。 

blockingqueue定義的常用方法如下: 

add(anobject):把anobject加到blockingqueue裡,如果blockingqueue可以容納,則返回true,否則丟擲異常。 

offer(anobject):表示如果可能的話,將anobject加到blockingqueue裡,即如果blockingqueue可以容納,則返回true,否則返回false。 

put(anobject):把anobject加到blockingqueue裡,如果blockingqueue沒有空間,則呼叫此方法的執行緒被阻斷直到blockingqueue裡有空間再繼續。 

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

take():取走blockingqueue裡排在首位的物件,若blockingqueue為空,阻斷進入等待狀態直到blockingqueue有新的物件被加入為止。 

blockingqueue有四個具體的實現類,根據不同需求,選擇不同的實現類: 

arrayblockingqueue:規定大小的blockingqueue,其建構函式必須帶乙個int引數來指明其大小。其所含的物件是以fifo(先入先出)順序排序的。 

linkedblockingqueue:大小不定的blockingqueue,若其建構函式帶乙個規定大小的引數,生成的blockingqueue 有大小限制,若不帶大小引數,所生成的blockingqueue的大小由integer.max_value來決定。其所含的物件是以fifo順序排序 的。 

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

synchronousqueue:特殊的blockingqueue,對其的操作必須是放和取交替完成的。 

生產者消費者 生產者與消費者模式

一 什麼是生產者與消費者模式 其實生產者與消費者模式就是乙個多執行緒併發協作的模式,在這個模式中呢,一部分執行緒被用於去生產資料,另一部分執行緒去處理資料,於是便有了形象的生產者與消費者了。而為了更好的優化生產者與消費者的關係,便設立乙個緩衝區,也就相當於乙個資料倉儲,當生產者生產資料時鎖住倉庫,不...

生產者消費者

using system using system.collections.generic using system.threading namespace gmservice foreach thread thread in producers q.exit console.read public...

生產者消費者

執行緒通訊 乙個執行緒完成了自己的任務時,要通知另外乙個執行緒去完成另外乙個任務.wait 等待 如果執行緒執行了wait方法,那麼該執行緒會進入等待的狀態,等待狀態下的執行緒必須要被其他執行緒呼叫notify方法才能喚醒。notify 喚醒 喚醒執行緒池等待執行緒其中的乙個。notifyall 喚...