熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java阻塞隊列實例分析與破解

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


From:http://tw.wingwit.com/Article/program/Java/hx/201311/25577.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.