如果第一個線程集運行的比第二個慢,則第二個線程集在等待結果時就會阻塞。如果第一個線程集運行的快,那麼它將等待第二個線程集趕上來。下面學步園小編來講解下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;
BlockingQueue
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(BlockingQueue
{
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("");
privateBlockingQueue
privateFilestartingDirectory;
}
/**
*Thistasksearchesfilesforagivenkeyword.
*/
classSearchTaskimplementsRunnable
{
/**
*ConstructsaSearchTask.
*@paramqueuethequeuefromwhichtotakefiles
*@paramkeywordthekeywordtolookfor
*/
publicSearchTask(BlockingQueue
{
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();
}
privateBlockingQueue
privateStringkeyword;
}
以上就是關於「Java阻塞隊列怎麼搜索」的內容,希望對大家有用。更多資訊請關注學步園。學步園,您學習IT技術的優質平台!