并发编程-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:一個不存儲元素的阻塞隊列
?
轉載于:https://www.cnblogs.com/qjm201000/p/10136910.html
總結
以上是生活随笔為你收集整理的并发编程-concurrent指南-阻塞队列BlockingQueue的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: KNNClassifier
- 下一篇: skype for business 无