阻塞佇列BlockingQueue

2021-06-28 06:53:28 字數 3852 閱讀 6314

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

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

public class blockingqueuetest 

}class data catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+"準備放入資料》");

try catch (interruptedexception e)

system.out.println(thread.currentthread().getname() + "已經放了資料," +

"佇列目前有" + queue.size() + "個資料"); }

public void getdata()catch(exception e)

system.out.println(thread.currentthread().getname()+"準備獲得資料..");

try catch (interruptedexception e)

system.out.println(thread.currentthread().getname()+"獲取資料完畢佇列目前有" + queue.size() + "個資料"); }}

class queuethread implements runnable

@override

public void run()

}}class queuethread2 implements runnable

@override

public void run()

}}

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-1已經放了資料,佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-1已經放了資料,佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-1已經放了資料,佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-1已經放了資料,佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

pool-1-thread-2準備獲得資料..

pool-1-thread-1準備放入資料》

pool-1-thread-1已經放了資料,佇列目前有1個資料

pool-1-thread-2獲取資料完畢佇列目前有0個資料

併發工具包 阻塞佇列BlockingQueue

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

等待佇列 阻塞非阻塞

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

12 阻塞佇列

非阻塞佇列 priorityqueue linkedlist linkedlist 是雙向鍊錶,它實現了 dequeue 介面 阻塞佇列 1 arrayblockingqueue 基於陣列實現的乙個阻塞佇列,在建立arrayblockingqueue 物件時必須制定容量大小。並且可以指定公平性與非公...