亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java中使用阻塞隊列控制線程集實例

2019-11-26 15:19:10
字體:
來源:轉載
供稿:網友

隊列以一種先進先出的方式管理數據。如果你試圖向一個已經滿了的阻塞隊列中添加一個元素,或是從一個空的阻塞隊列中移除一個元素,將導致線程阻塞。在多線程進行合作時,阻塞隊列是很有用的工具。工作者線程可以定期的把中間結果存到阻塞隊列中。而其他工作者線程把中間結果取出并在將來修改它們。隊列會自動平衡負載。如果第一個線程集運行的比第二個慢,則第二個線程集在等待結果時就會阻塞。如果第一個線程集運行的快,那么它將等待第二個線程集趕上來。

下面的程序展示了如何使用阻塞隊列來控制線程集。程序在一個目錄及它的所有子目錄下搜索所有文件,打印出包含指定關鍵字的文件列表。

java.util.concurrent包提供了阻塞隊列的4個變種:LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue和DelayQueue。我們用的是ArrayBlockingQueue。ArrayBlockingQueue在構造時需要給定容量,并可以選擇是否需要公平性。如果公平參數被設置了,等待時間最長的線程會優先得到處理。通常,公平性會使你在性能上付出代價,只有在的確非常需要的時候再使用它。

生產者線程枚舉在所有子目錄下的所有文件并把它們放到一個阻塞隊列中。這個操作很快,如果隊列沒有設上限的話,很快它就包含了沒有找到的文件。

我們同時還啟動了大量的搜索線程。每個搜索線程從隊列中取出一個文件,打開它,打印出包含關鍵字的所有行,然后取出下一個文件。我們使用了一個小技巧來在工作結束后終止線程。為了發出完成信號,枚舉線程把一個虛擬對象放入隊列。(這類似于在行李輸送帶上放一個寫著“最后一個包”的虛擬包。)當搜索線程取到這個虛擬對象時,就將其放回并終止。

注意,這里不需要人任何顯示的線程同步。在這個程序中,我們使用隊列數據結構作為一種同步機制。

復制代碼 代碼如下:

import java.io.*; 
import java.util.*; 
import java.util.concurrent.*; 

public class BlockingQueueTest 

   public static void main(String[] args) 
   { 
      Scanner in = new Scanner(System.in); 
      System.out.print("Enter base directory (e.g. /usr/local/jdk1.6.0/src): "); 
      String directory = in.nextLine(); 
      System.out.print("Enter keyword (e.g. volatile): "); 
      String keyword = in.nextLine(); 

      final int FILE_QUEUE_SIZE = 10; 
      final int SEARCH_THREADS = 100; 

      BlockingQueue<File> queue = new ArrayBlockingQueue<File>(FILE_QUEUE_SIZE); 

      FileEnumerationTask enumerator = new FileEnumerationTask(queue, new File(directory)); 
      new Thread(enumerator).start(); 
      for (int i = 1; i <= SEARCH_THREADS; i++) 
         new Thread(new SearchTask(queue, keyword)).start(); 
   } 

/** 
 * This task enumerates all files in a directory and its subdirectories. 
 */
class FileEnumerationTask implements Runnable 

   /** 
    * Constructs a FileEnumerationTask. 
    * @param queue the blocking queue to which the enumerated files are added 
    * @param startingDirectory the directory in which to start the enumeration 
    */
   public FileEnumerationTask(BlockingQueue<File> queue, File startingDirectory) 
   { 
      this.queue = queue; 
      this.startingDirectory = startingDirectory; 
   } 

   public void run() 
   { 
      try
      { 
         enumerate(startingDirectory); 
         queue.put(DUMMY); 
      } 
      catch (InterruptedException e) 
      { 
      } 
   } 

   /** 
    * Recursively enumerates all files in a given directory and its subdirectories 
    * @param directory the directory in which to start 
    */
   public void enumerate(File directory) throws InterruptedException 
   { 
      File[] files = directory.listFiles(); 
      for (File file : files) 
      { 
         if (file.isDirectory()) enumerate(file); 
         else queue.put(file); 
      } 
   } 

   public static File DUMMY = new File(""); 

   private BlockingQueue<File> queue; 
   private File startingDirectory; 

/** 
 * This task searches files for a given keyword. 
 */
class SearchTask implements Runnable 

   /** 
    * Constructs a SearchTask. 
    * @param queue the queue from which to take files 
    * @param keyword the keyword to look for 
    */
   public SearchTask(BlockingQueue<File> queue, String keyword) 
   { 
      this.queue = queue; 
      this.keyword = keyword; 
   } 

   public void run() 
   { 
      try
      { 
         boolean done = false; 
         while (!done) 
         { 
            File file = queue.take(); 
            if (file == FileEnumerationTask.DUMMY) 
            { 
               queue.put(file); 
               done = true; 
            } 
            else search(file);             
         } 
      } 
      catch (IOException e) 
      { 
         e.printStackTrace(); 
      } 
      catch (InterruptedException e) 
      { 
      }       
   } 

   /** 
    * Searches a file for a given keyword and prints all matching lines. 
    * @param file the file to search 
    */
   public void search(File file) throws IOException 
   { 
      Scanner in = new Scanner(new FileInputStream(file)); 
      int lineNumber = 0; 
      while (in.hasNextLine()) 
      { 
         lineNumber++; 
         String line = in.nextLine().trim(); 
         if (line.contains(keyword)) System.out.printf("%s:%d    %s%n", file.getPath(), lineNumber, line); 
      } 
      in.close(); 
   } 

   private BlockingQueue<File> queue; 
   private String keyword; 
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲成人a级网| 国产精品久久91| 欧美高清自拍一区| 国产综合在线观看视频| 色噜噜狠狠色综合网图区| 伊人伊成久久人综合网小说| 亚洲成av人乱码色午夜| 久久久久久久久久久av| 日韩欧美有码在线| 国产91精品视频在线观看| 最新91在线视频| 91九色视频导航| 国产一区二区三区在线免费观看| 亚洲一区二区三区视频播放| 国产区亚洲区欧美区| 欧美福利视频网站| 国产精品日韩在线观看| 久久欧美在线电影| 欧美在线观看网站| 欧美一级黄色网| 91精品成人久久| 欧美高清性猛交| 国产精品18久久久久久麻辣| 懂色av影视一区二区三区| 中文字幕精品在线| 久久久久北条麻妃免费看| 久久99热这里只有精品国产| 91久久中文字幕| 欧美高清视频一区二区| 欧美日韩激情视频8区| 成人激情av在线| 韩曰欧美视频免费观看| 国产精品久久久久久久久| 91免费视频国产| 久久亚洲国产成人| 欧美国产激情18| 日韩美女视频在线观看| 亚洲欧美日韩视频一区| 91精品国产色综合久久不卡98| 欧美第一淫aaasss性| 黑人巨大精品欧美一区二区三区| 久久成人人人人精品欧| 9.1国产丝袜在线观看| 亚洲a在线观看| 欧美成人黑人xx视频免费观看| 国产成人精品综合久久久| 国产精品专区h在线观看| 国产精品999| 亚洲精品按摩视频| 亚洲在线观看视频网站| 欧美专区国产专区| 日日摸夜夜添一区| 国产精品久久久久久久久借妻| 久久av资源网站| 国产精品自拍小视频| 91在线视频导航| 欧美高清无遮挡| 国产日韩欧美夫妻视频在线观看| 亚洲欧美日本另类| 国产精品av免费在线观看| 中文字幕在线观看亚洲| 久久久久久久久综合| 日韩免费观看在线观看| 这里只有视频精品| 国产z一区二区三区| 国产欧美日韩最新| 国产99久久精品一区二区 夜夜躁日日躁| 久久久亚洲福利精品午夜| 亚洲欧美变态国产另类| 欧洲亚洲女同hd| 国产ts一区二区| 久久久精品亚洲| 在线亚洲午夜片av大片| 国产精品99蜜臀久久不卡二区| 久久人人爽人人爽人人片av高清| 亚洲美女久久久| 日本精品视频在线播放| 久久久久久久久久久免费精品| 成人国产精品一区二区| 欧美一级在线播放| 欧美激情欧美激情| 亚洲激情视频在线观看| 668精品在线视频| 黄色成人av网| 欧美大片在线看免费观看| 午夜精品久久久久久久久久久久| 亚洲字幕一区二区| 欧美大片免费看| 欧美日韩中文字幕在线| 国产色视频一区| 日韩av在线天堂网| 久久九九有精品国产23| 国产欧美一区二区三区久久| 亚洲天堂网站在线观看视频| 日韩在线欧美在线国产在线| 在线播放国产一区中文字幕剧情欧美| 久久久国产精品免费| 亚洲欧美激情精品一区二区| 高清欧美性猛交xxxx黑人猛交| 亚洲精品日韩av| 国产97色在线|日韩| 日韩av在线看| 国产精品丝袜久久久久久高清| 亚洲中国色老太| 欧美视频中文字幕在线| 欧美激情视频在线免费观看 欧美视频免费一| 97国产精品人人爽人人做| 国产有码在线一区二区视频| 欧美激情二区三区| 色妞在线综合亚洲欧美| 欧美成人午夜影院| 国产日产久久高清欧美一区| 成人精品视频在线| 91精品久久久久久久久久入口| 91视频免费网站| 国产亚洲精品一区二555| 一本一本久久a久久精品牛牛影视| 亚洲人成77777在线观看网| 精品一区精品二区| 国产精品一区二区av影院萌芽| 国产欧美精品在线| 亚洲va久久久噜噜噜久久天堂| 一区二区三区日韩在线| 国产伦精品免费视频| 欧美精品一本久久男人的天堂| 欧美成在线观看| 91最新国产视频| 在线观看欧美日韩| 日韩国产欧美区| 久久99国产精品自在自在app| 亚洲自拍偷拍色片视频| 欧美一级视频在线观看| 欧洲精品久久久| 97福利一区二区| 国产精品视频久| 久久久精品网站| 成人乱人伦精品视频在线观看| 亚洲自拍偷拍色图| 国产精品免费一区| 日韩天堂在线视频| 2019中文字幕全在线观看| 国产精品成人观看视频国产奇米| 亚洲午夜精品久久久久久性色| 久久精品国产91精品亚洲| 亚洲免费一级电影| 久久久久久999| 欧美性xxxxxx| www.美女亚洲精品| 在线观看日韩欧美| 日韩av在线免费| 亚洲欧洲一区二区三区在线观看| 日韩**中文字幕毛片| 亚洲国产免费av| 久久精品电影一区二区| 91久久国产综合久久91精品网站| 成人午夜一级二级三级| 欧美老女人性生活| 欧美xxxx做受欧美| 久久久久久国产免费| 成人两性免费视频| 日韩av电影在线播放| 国产精品久久91| 日韩中文字幕国产精品| 欧美综合国产精品久久丁香|