1. 程式人生 > >併發程式設計-concurrent指南-阻塞佇列BlockingQueue

併發程式設計-concurrent指南-阻塞佇列BlockingQueue

阻塞佇列BlockingQueue,java.util.concurrent下的BlockingQueue介面表示一個執行緒放入和提取例項的佇列。

適用場景:

BlockingQueue通常用於一個執行緒生產物件,而另一個執行緒消費物件的場景。

一個執行緒往裡面放,另一個執行緒從裡面取的一個BlockingQueue。

生產執行緒,一個執行緒將會持續生產新物件並將其插入到佇列中去,直到佇列達到它所能容納的臨界點。如果該阻塞佇列到達了臨界點,負責生產的執行緒將會在往裡面插入新物件時發生阻塞。它會一個處於阻塞中,直到負責消費的執行緒從佇列中拿走一個物件。

消費執行緒,負責消費的執行緒將會一直從該阻塞佇列中拿出物件。如果消費執行緒嘗試去從一個空的佇列中提取物件的話,這個消費執行緒將會處於阻塞之中,直到一個生產執行緒把一個物件丟進佇列。

BlockingQueue的方法

四組不同的行為方式解釋:

  • 拋異常:如果試圖操作無法立即執行,拋一個異常
  • 特定值:如果試圖操作無法立即執行,返回一個特定的值(true或false)
  • 阻塞:如果試圖操作無法立即執行,該方法呼叫將會發生阻塞,直到能夠執行
  • 超時:如果試圖操作無法立即執行,該方法呼叫將會發生阻塞,直到能夠執行,但等待時間不會超過給定值。返回一個特定值以告知該操作是否成功

無法向一個BlockingQueue中插入null。如果試圖插入null,BlockingQueue會丟擲一個NullPointException。

可以訪問到 BlockingQueue 中的所有元素,而不僅僅是開始和結束的元素。比如說,你將一個物件放入佇列之中以等待處理,但你的應用想要將其取消掉。那麼你可以呼叫諸如 remove(o) 方法來將佇列之中的特定物件進行移除。但是這麼幹效率並不高(譯者注:基於佇列的資料結構,獲取除開始或結束位置的其他物件的效率不會太高)

,因此你儘量不要用這一類的方法,除非你確實不得不那麼做。

 

BlockingQueue的實現

BlockingQueue介面的實現類:

  • ArrayBlockingQueue
  • DelayQueue
  • LinkedBlockingQueue
  • PriorityBlockingQueue
  • SynchronousQueue