Java中怎么搜索阻塞队列
创始人
2024-12-19 01:01:37
0次

  Java阻塞队列怎么搜索

  java.util.concurrent包提供了阻塞队列的4个变种:LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue和DelayQueue。我们用的是ArrayBlockingQueue。ArrayBlockingQueue在构造时需要给定容量,并可以选择是否需要公平性。如果公平参数被设置了,等待时间最长的线程会优先得到处理。通常,公平性会使你在性能上付出代价,只有在的确非常需要的时候再使用它。

  生产者线程枚举在所有子目录下的所有文件并把它们放到一个阻塞队列中。这个操作很快,如果队列没有设上限的话,很快它就包含了没有找到的文件。

  我们同时还启动了大量的搜索线程。每个搜索线程从队列中取出一个文件,打开它,打印出包含关键字的所有行,然后取出下一个文件。我们使用了一个小技巧来在工作结束后终止线程。为了发出完成信号,枚举线程把一个虚拟对象放入队列。(这类似于在行李输送带上放一个写着“最后一个包”的虚拟包。)当搜索线程取到这个虚拟对象时,就将其放回并终止。

  注意,这里不需要人任何显示的线程同步。在这个程序中,我们使用队列数据结构作为一种同步机制。

  Java阻塞队列怎么搜索

  importjava.io.*;

  importjava.util.*;

  importjava.util.concurrent.*;

  publicclassBlockingQueueTest

  {

  publicstaticvoidmain(String[]args)

  {

  Scannerin=newScanner(System.in);

  System.out.print("Enterbasedirectory(e.g./usr/local/jdk1.6.0/src):");

  Stringdirectory=in.nextLine();

  System.out.print("Enterkeyword(e.g.volatile):");

  Stringkeyword=in.nextLine();

  finalintFILE_QUEUE_SIZE=10;

  finalintSEARCH_THREADS=100;

  BlockingQueuequeue=newArrayBlockingQueue(FILE_QUEUE_SIZE);

  FileEnumerationTaskenumerator=newFileEnumerationTask(queue,newFile(directory));

  newThread(enumerator).start();

  for(inti=1;i<=SEARCH_THREADS;i++)   newThread(newSearchTask(queue,keyword)).start();   }   }   /**   *Thistaskenumeratesallfilesinadirectoryanditssubdirectories.   */   classFileEnumerationTaskimplementsRunnable   {   /**   *ConstructsaFileEnumerationTask.   *@paramqueuetheblockingqueuetowhichtheenumeratedfilesareadded   *@paramstartingDirectorythedirectoryinwhichtostarttheenumeration   */   publicFileEnumerationTask(BlockingQueuequeue,FilestartingDirectory)

  {

  this.queue=queue;

  this.startingDirectory=startingDirectory;

  }

  publicvoidrun()

  {

  try

  {

  enumerate(startingDirectory);

  queue.put(DUMMY);

  }

  catch(InterruptedExceptione)

  {

  }

  }

  /**

  *Recursivelyenumeratesallfilesinagivendirectoryanditssubdirectories

  *@paramdirectorythedirectoryinwhichtostart

  */

  publicvoidenumerate(Filedirectory)throwsInterruptedException

  {

  File[]files=directory.listFiles();

  for(Filefile:files)

  {

  if(file.isDirectory())enumerate(file);

  elsequeue.put(file);

  }

  }

  publicstaticFileDUMMY=newFile("");

  privateBlockingQueuequeue;

  privateFilestartingDirectory;

  }

  /**

  *Thistasksearchesfilesforagivenkeyword.

  */

  classSearchTaskimplementsRunnable

  {

  /**

  *ConstructsaSearchTask.

  *@paramqueuethequeuefromwhichtotakefiles

  *@paramkeywordthekeywordtolookfor

  */

  publicSearchTask(BlockingQueuequeue,Stringkeyword)

  {

  this.queue=queue;

  this.keyword=keyword;

  }

  publicvoidrun()

  {

  try

  {

  booleandone=false;

  while(!done)

  {

  Filefile=queue.take();

  if(file==FileEnumerationTask.DUMMY)

  {

  queue.put(file);

  done=true;

  }

  elsesearch(file);

  }

  }

  catch(IOExceptione)

  {

  e.printStackTrace();

  }

  catch(InterruptedExceptione)

  {

  }

  }

  /**

  *Searchesafileforagivenkeywordandprintsallmatchinglines.

  *@paramfilethefiletosearch

  */

  publicvoidsearch(Filefile)throwsIOException

  {

  Scannerin=newScanner(newFileInputStream(file));

  intlineNumber=0;

  while(in.hasNextLine())

  {

  lineNumber++;

  Stringline=in.nextLine().trim();

  if(line.contains(keyword))System.out.printf("%s:%d%s%n",file.getPath(),lineNumber,line);

  }

  in.close();

  }

  privateBlockingQueuequeue;

  privateStringkeyword;

  }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...