- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) > 編程語(yǔ)言 >
- Java中怎么搜索阻塞隊列
本篇文章為大家展示了Java中怎么搜索阻塞隊列,內容簡(jiǎn)明扼要并且容易理解,絕對能使你眼前一亮,通過(guò)這篇文章的詳細介紹希望你能有所收獲。
Java阻塞隊列怎么搜索
java.util.concurrent包提供了阻塞隊列的4個(gè)變種:LinkedBlockingQueue、ArrayBlockingQueue、PriorityBlockingQueue和DelayQueue。我們用的是ArrayBlockingQueue。ArrayBlockingQueue在構造時(shí)需要給定容量,并可以選擇是否需要公平性。如果公平參數被設置了,等待時(shí)間最長(cháng)的線(xiàn)程會(huì )優(yōu)先得到處理。通常,公平性會(huì )使你在性能上付出代價(jià),只有在的確非常需要的時(shí)候再使用它。
生產(chǎn)者線(xiàn)程枚舉在所有子目錄下的所有文件并把它們放到一個(gè)阻塞隊列中。這個(gè)操作很快,如果隊列沒(méi)有設上限的話(huà),很快它就包含了沒(méi)有找到的文件。
我們同時(shí)還啟動(dòng)了大量的搜索線(xiàn)程。每個(gè)搜索線(xiàn)程從隊列中取出一個(gè)文件,打開(kāi)它,打印出包含關(guān)鍵字的所有行,然后取出下一個(gè)文件。我們使用了一個(gè)小技巧來(lái)在工作結束后終止線(xiàn)程。為了發(fā)出完成信號,枚舉線(xiàn)程把一個(gè)虛擬對象放入隊列。(這類(lèi)似于在行李輸送帶上放一個(gè)寫(xiě)著(zhù)“最后一個(gè)包”的虛擬包。)當搜索線(xiàn)程取到這個(gè)虛擬對象時(shí),就將其放回并終止。
注意,這里不需要人任何顯示的線(xiàn)程同步。在這個(gè)程序中,我們使用隊列數據結構作為一種同步機制。
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;
}
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站