隊列是什麼?隊列以一種先進先出的方式管理數據
如果你試圖向一個已經滿了的阻塞隊列中添加一個元素
或是從一個空的阻塞隊列中移除一個元素
將導致線程阻塞
在多線程進行合作時
阻塞隊列是很有用的工具
工作者線程可以定期的把中間結果存到阻塞隊列中
而其他工作者線程把中間結果取出並在將來修改它們
隊列會自動平衡負載
如果第一個線程集運行的比第二個慢
則第二個線程集在等待結果時就會阻塞
如果第一個線程集運行的快
那麼它將等待第二個線程集趕上來
下面的程序展示了如何使用阻塞隊列來控制線程集
程序在一個目錄及它的所有子目錄下搜索所有文件
打印出包含指定關鍵字的文件列表
ncurrent包提供了阻塞隊列的
個變種
LinkedBlockingQueue
ArrayBlockingQueue
PriorityBlockingQueue和DelayQueue
我們用的是ArrayBlockingQueue
ArrayBlockingQueue在構造時需要給定容量
並可以選擇是否需要公平性
如果公平參數被設置了
等待時間最長的線程會優先得到處理
通常
公平性會使你在性能上付出代價
只有在的確非常需要的時候再使用它
生產者線程枚舉在所有子目錄下的所有文件並把它們放到一個阻塞隊列中
這個操作很快
如果隊列沒有設上限的話
很快它就包含了沒有找到的文件
我們同時還啟動了大量的搜索線程
每個搜索線程從隊列中取出一個文件
打開它
打印出包含關鍵字的所有行
然後取出下一個文件
我們使用了一個小技巧來在工作結束後終止線程
為了發出完成信號
枚舉線程把一個虛擬對象放入隊列
(這類似於在行李輸送帶上放一個寫著
最後一個包
的虛擬包
)當搜索線程取到這個虛擬對象時
就將其放回並終止
注意
這裡不需要人任何顯示的線程同步
在這個程序中
我們使用隊列數據結構作為一種同步機制
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25577.html