现在的位置: 首页 > 编程语言 > 正文

Java阻塞队列怎么搜索

2020年06月05日 编程语言 ⁄ 共 1237字 ⁄ 字号 评论关闭

  如果第一个线程集运行的比第二个慢,则第二个线程集在等待结果时就会阻塞。如果第一个线程集运行的快,那么它将等待第二个线程集赶上来。下面学步园小编来讲解下Java阻塞队列怎么搜索?

  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;

  }

  以上就是关于“Java阻塞队列怎么搜索”的内容,希望对大家有用。更多资讯请关注学步园。学步园,您学习IT技术的优质平台!

抱歉!评论已关闭.