日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java并發(Runnable+Thread)實現硬盤文件搜索功能

瀏覽:28日期:2022-08-17 16:41:47
零、插播2020CSDN博客之星投票新聞

近日(1月11日-1月24日),2020CSDN博客之星評選正在火熱進行中,作為碼齡1年的小白有幸入選Top 200,首先很感謝CSDN官方把我選上,本來以為只是來湊熱鬧,看大佬們PK 。

綜合過去9天大佬們戰況,前10名大佬基本坐得很穩,后期出現黑馬發力,勢不可擋,都在沖刺Top 20,有了微妙的變化,不得不令人佩服點贊!真正的實力可以看出,文章數量不重要,更重要的是質量!一切用數據說話,如圖:

截至 2021-01-20 11:50:02

Java并發(Runnable+Thread)實現硬盤文件搜索功能

看了大佬的驚人數據,與我差距甚大,不禁感慨,接下來看看我自己!

首先,很感謝每一位幫忙投票的粉絲和兄弟姐妹們,感謝您的關注和支持,經過大家上一周的共同努力,我已進入2020博客之星投票排行榜Top 100。

投票還有一周時間,進入更激烈更有懸念的階段,希望讀者們下來一周能投出您手中寶貴的票權,讓我更進一步!

投票地址:https://bss.csdn.net/m/topic/blog_star2020/detail?username=charzous

或者掃碼投票:

Java并發(Runnable+Thread)實現硬盤文件搜索功能

Java并發(Runnable+Thread)實現硬盤文件搜索功能

重點:每一個投票都會被記錄,投了之后找Charzous幫忙也容易了(瘋狂暗示投票拉票)!

比如,幫忙下載資源,或者博客一鍵三連,再次對每位幫我投票的粉絲表示感謝! 😊新的一年,讓我們一起變得更強!

即日起到24號,每天都可以投票哦,票數越多,貢獻排行榜就越靠前,我就記住你的名字啦!

24號是否能和大佬們在頂峰相見,就靠大家了哈!

一、承上啟下

前一篇學習了Java并發程序設計原理之后,為了對這個部分有了更深層的理解,并運用于實際場景中,所以我找了比較實際的案例進行實踐——文件搜索,簡單來說,這也是電腦文件系統中的一個常見功能,用戶可以通過用戶名搜索文件系統中符合條件的文件。

文件搜索的程序需要用到Java并發API中的Thread類和Runnable接口,其中一些重要的內容先簡單了解一下。

二、Java中的多線程

線程類Thread,有兩種方式創建執行線程。

1、擴展Thread類并重載run()方法

Thread類包含了豐富的方法,在實現線程時候必須重載run方法,擴展Thread類和調用start方法創建新的線程。其他常用方法:

getId():獲取Thread對象的標識符,線程整個生命周期中唯一不變的一個正整數。getName()/setName():String類型,獲取或設置Thread對象名。getPriority()/setPriority():獲取或設置線程的優先級。值范圍:Thread.MIN_PRIORITY~Thread.MAX_PRIORITY(1~10),創建時默認Thread.NORM_PRIORITY(5)。getState():線程對象的狀態。包括:NEW(新創建)、RUNNABLE(運行中)、BLOCKED(等待鎖定)、WAITING(等待)、TIME_WAITING(有時間限制等待)、THREAD(完成)。線程在一段時間中只能處于一種狀態,而且是在JVM中的狀態,不能映射到操作系統的線程狀態。interrupt():請求結束執行Thread對象。interrupted():檢查中斷狀態,清除中斷標志的值。isInterrupted():檢查中斷狀態,不清除中斷標志的值。sleep():線程執行睡眠時間,單位毫秒。join():暫停調用線程的執行,直到調用該方法的線程執行結束為止。currentThread():靜態方法,返回實際執行當前任務的Thread對象。2、實現Runnable接口

可以通過線程來執行Runnable對象,更靈活更改并發程序,還可以通過不同線程使用同一個Runnable對象。

相對來說,使用Runnable接口創建線程的方法更加推薦,它只定義了run方法,是每個線程的主方法。當執行start方法啟動新線程時,就會調用run方法。

三、串行文件搜索

這里分為兩種版本,串行(單線程)和并發(多線程),后續可以進行比較。

1、創建公共類Result保存搜索結果

/** * Result.java * @author Charzous * @date 2021/1/20 11:00 * */ package SearchFiles; public class Result { boolean found; String path; public void setFound(boolean found){ this.found=found; } public boolean isFound(){ return this.found; } public void setPath(String path){ this.path=path; } public String getPath(){ return this.path; }}2、查找算法

算法思路簡單,通過初始路徑,獲取文件和目錄內容,并與目標文件名進行比較,相同則記錄Result,算法完成;不同則遞歸遍歷文件,直到算法完成。

/** * * SerialSearch.java * @author Charzous * @date 2021/1/20 11:15 * */ package SearchFiles; import java.io.File; public class SerialFileSearch { public static void searchFiles(File file,String fileName,Result result){ File[] contents; contents=file.listFiles(); if ((contents==null)||(contents.length==0)) return; for (File content:contents){ if (content.isDirectory()) searchFiles(content,fileName,result); else{ if (content.getName().equals(fileName)){ result.setPath(content.getAbsolutePath()); result.setFound(true); System.out.println('Serial Search Path: '+result.getPath()); return; } } if (result.isFound()) return; } } public static void main(String[] args) { Result result=new Result(); File file=new File('D:'); long startTime=System.currentTimeMillis(); String fileName='maskOrder.txt'; SerialFileSearch.searchFiles(file,fileName,result); if (!result.isFound()) System.out.println('未找到該文件:'+fileName); else System.out.println('找到該文件:'+fileName+'!'); System.out.println('查詢時間:'+(System.currentTimeMillis()-startTime)+'ms'); }}四、并行文件搜索(多線程)1、創建ParallelGroupFileTask類

它實現所有用于查找文件的線程,實現Runnable接口,重載run方法,其中包括了處理目錄的processDirectory方法,處理文件的processFile方法。

/** * ParallelGroupFileTask.java * @author Charzous * @date 2021/1/20 11:31 * */package SearchFiles; import java.io.File;import java.util.concurrent.ConcurrentLinkedQueue; class ParallelGroupFileTask implements Runnable { private final String fileName; private final ConcurrentLinkedQueue<File> directories; private final Result parallelResult; private boolean found; public ParallelGroupFileTask(String fileName, ConcurrentLinkedQueue<File> directories, Result parallelResult) { this.fileName = fileName; this.directories = directories; this.parallelResult = parallelResult; } @Override public void run() { while (directories.size() > 0) { File file = directories.poll(); try { processDirectory(file,fileName,parallelResult);//遞歸 if (found) { System.out.println(Thread.currentThread().getName() + ' has found the file'); System.out.println('parallel search:Path :' + parallelResult.getPath()); return; } } catch (Exception e) { System.out.println(Thread.currentThread().getName() + ' hae been interrupted'); } } } public void processDirectory(File file, String fileName, Result parallelResult) throws InterruptedException { File[] contents; contents = file.listFiles(); if ((contents == null) || (contents.length == 0)) return; for (File content : contents) { if (content.isDirectory()) { processDirectory(content, fileName, parallelResult); if (Thread.currentThread().isInterrupted()) throw new InterruptedException(); if (found) return; } else { processFile(content, fileName, parallelResult);//遞歸 if (Thread.currentThread().isInterrupted()) throw new InterruptedException(); if (found) return; } } } public void processFile(File content, String fileName, Result parallelResult) { if (content.getName().equals(fileName)) { parallelResult.setPath(content.getAbsolutePath()); this.found = true; } } public boolean getFound() { return found; } }2、多線程算法

創建ParallelGroupFileSearch類,其中包括了存放基本路徑的線程安全的列表ConcurrentLinkedQueue,然后創建新線程,數量有JVM中可用的線程數量,通過Runtime的availableProcessors方法獲得。

其中,若某個線程找到目標文件,會使用interrupt方法取消其他線程的執行。具體實現代碼如下:

/** * ParallelGroupFileSearch.java * @author Charzous * @date 2021/1/20 11:40 * */package SearchFiles; import java.io.File;import java.util.concurrent.ConcurrentLinkedQueue; public class ParallelGroupFileSearch { public static void searchFiles(File file, String fileName, Result parallelResult) { ConcurrentLinkedQueue<File> directories = new ConcurrentLinkedQueue<>(); File[] contents = file.listFiles(); for (File content : contents) { if (content.isDirectory()) directories.add(content); } int numThreads = Runtime.getRuntime().availableProcessors(); Thread[] threads = new Thread[numThreads]; ParallelGroupFileTask[] tasks = new ParallelGroupFileTask[numThreads]; for (int i = 0; i < numThreads; i++) { tasks[i] = new ParallelGroupFileTask(fileName, directories, parallelResult); threads[i] = new Thread(tasks[i]); threads[i].start(); } boolean finish = false; int numFinished = 0; while (!finish) { numFinished = 0; for (int i = 0; i < threads.length; i++) { if (threads[i].getState() == Thread.State.TERMINATED) { numFinished++; if (tasks[i].getFound()) finish = true; } } if (numFinished == threads.length) finish = true; } if (numFinished != threads.length) { for (Thread thread : threads) thread.interrupt(); } } public static void main(String[] args) { Result result=new Result(); File file=new File('D:'); String fileName='maskOrder.txt'; long startTime=System.currentTimeMillis(); ParallelGroupFileSearch.searchFiles(file,fileName,result); System.out.println('查詢時間:'+(System.currentTimeMillis()-startTime)+'ms'); } }五、結果1、串行(單線程)

串行版本多次測試結果用時在1900ms左右!

10次測試數據:

查詢時間:1978ms 2036 1860 1926 1861 2100 1889 2030 1905 1990

Java并發(Runnable+Thread)實現硬盤文件搜索功能

Java并發(Runnable+Thread)實現硬盤文件搜索功能

2、并發(多線程)

并發版本多線程測試用時在1400ms左右!

10次測試數據:

查詢時間:1441ms 1368 1258 1546 1444 1430 1490 1432 1338 1435

Java并發(Runnable+Thread)實現硬盤文件搜索功能

Java并發(Runnable+Thread)實現硬盤文件搜索功能

從簡單的測試結果可以看出,并發搜索的算法速度提升明顯。

這一篇通過實際的案例進行實踐——文件搜索,簡單來說,這也是電腦文件系統中的一個常見功能,用戶可以通過用戶名搜索文件系統中符合條件的文件。Runnable接口和Thread類的基本使用也有了更深的認識。在文件搜索這個案例中,學習了Java并發原理的實際應用,首先設計一種串行的版本,然后再實現并發的版本,這也是一個改進的過程。

到此這篇關于Java并發(Runnable+Thread)實現硬盤文件搜索的文章就介紹到這了,更多相關Java并發硬盤文件搜索內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
青草国产精品| 国精品产品一区| 精品免费av在线| 激情国产在线| 亚洲一级特黄| 亚洲一本视频| 亚洲精品观看| 国产精品久久久久久久久久久久久久久| 欧美日韩一视频区二区| 欧美激情福利| 今天的高清视频免费播放成人| 欧美日韩日本国产亚洲在线 | 亚洲国产影院| 爽好多水快深点欧美视频| 日本亚州欧洲精品不卡| 91欧美精品| 91av亚洲| 亚洲精品大片| 福利精品在线| 国产美女一区| 麻豆一区在线| 免费在线观看视频一区| 美女精品久久| 夜夜精品视频| 日韩三级精品| 久久久精品久久久久久96| 1024精品久久久久久久久| 亚洲精品自拍| 91精品国产91久久久久久黑人| 深夜福利一区| 婷婷综合社区| 欧美激情视频一区二区三区在线播放| 久久精品在线| 国产精品亚洲综合久久| 午夜欧美视频| 9999国产精品| 91嫩草精品| 影院欧美亚洲| 日韩免费小视频| 日韩一区二区三区免费视频| 99久久精品网| 精品美女视频| 欧美日韩亚洲一区在线观看| 好吊一区二区三区| 天堂а√在线最新版中文在线| 日韩精品欧美成人高清一区二区| 久久高清免费| 日韩精品2区| 中文在线а√在线8| 麻豆精品国产91久久久久久| 婷婷综合国产| 夜夜嗨av一区二区三区网站四季av| 日韩av在线播放网址| 国产精品美女久久久久久不卡| 伊人久久成人| 欧美日韩国产亚洲一区| 国产一区日韩欧美| 国产在线欧美| 国产日韩专区| 午夜在线播放视频欧美| 中文国产一区| 亚洲性视频在线| 亚洲精品动态| 国产精品一国产精品k频道56| 国产精品中文| 久久久久久久欧美精品| 亚洲美洲欧洲综合国产一区 | 国产日韩三级| 黄色亚洲免费| 另类欧美日韩国产在线| 亚洲综合电影一区二区三区| 日韩有码av| 免费国产自线拍一欧美视频| 日本成人手机在线| 蜜桃av.网站在线观看| 99视频精品全部免费在线视频| 91精品一区二区三区综合在线爱 | 美美哒免费高清在线观看视频一区二区| 999久久久国产精品| 欧美特黄一区| 亚洲五月综合| 精品视频自拍| 精品一区二区三区视频在线播放| 麻豆精品99| 婷婷色综合网| 青草综合视频| 久久网站免费观看| 亚洲精品乱码久久久久久蜜桃麻豆| 日韩影片在线观看| 高清不卡一区| 欧美日韩精品一本二本三本| 另类av一区二区| 成人日韩av| 少妇精品在线| 久久中文亚洲字幕| 国产精品宾馆| 视频一区中文字幕| av中文字幕在线观看第一页| 亚洲精品亚洲人成在线观看| 久久精品成人| 国产一区国产二区国产三区| 蜜臀a∨国产成人精品| 国产乱码午夜在线视频| 亚洲精品乱码| 亚洲主播在线| 日韩国产一区| 日本综合精品一区| 日韩电影免费网站| 日韩精品视频在线看| 亚洲一区二区毛片| 久久伦理在线| 国产aⅴ精品一区二区三区久久| 日本亚洲不卡| 亚洲影院天堂中文av色| 欧美中文一区二区| 国产麻豆久久| 欧美二三四区| 麻豆成全视频免费观看在线看| 日韩av一区二区三区| 日韩欧美2区| 免费国产自线拍一欧美视频| 一区二区三区四区在线看| se01亚洲视频 | 黄色亚洲免费| 午夜视频精品| 欧美日韩国产在线一区| 在线精品视频在线观看高清| 99久久精品网站| 伊人久久大香线蕉av不卡| 久久三级视频| 麻豆9191精品国产| 日本va欧美va瓶| 国产亚洲观看| 国产精久久久| 色偷偷色偷偷色偷偷在线视频| 日韩和的一区二在线| 影院欧美亚洲| 日韩有吗在线观看| 成人亚洲精品| 国产亚洲欧洲| 国产精品一区二区三区av| 精品国产18久久久久久二百| 日韩在线短视频| 免费不卡在线视频| 国产精品日本一区二区不卡视频 | 999国产精品视频| 99国产成+人+综合+亚洲欧美| 99国产一区| 国产精品极品国产中出| 日本不卡免费高清视频在线| 性欧美xxxx免费岛国不卡电影| 亚洲一区欧美二区| 国产精品一线天粉嫩av| 中文字幕成在线观看| 视频一区二区三区中文字幕| 免费日韩一区二区三区| 欧美aa在线观看| 日韩精品一二区| 黑森林国产精品av| 日韩欧美另类中文字幕| 欧美aa一级| 国产亚洲观看| 日韩视频免费| 国产精品伦理久久久久久| 一二三区精品| 欧美日韩在线观看视频小说| 人人精品久久| 免费日韩av片| 久久久久99| 国产成人精品亚洲线观看| 亚欧洲精品视频在线观看| 伊人精品一区| 国产视频网站一区二区三区| 亚洲午夜av| 欧美成a人国产精品高清乱码在线观看片在线观看久 | 欧美亚洲tv| 欧美日韩在线播放视频| 久久精品国产亚洲一区二区三区| 综合激情网...| 国产婷婷精品| 伊人影院久久| 午夜国产精品视频免费体验区| 正在播放日韩精品| 国产精品2区| 久久99性xxx老妇胖精品| 青青草91视频| 国产亚洲精aa在线看| 国产日韩免费| 国产极品久久久久久久久波多结野| 欧美影院精品| 国产精品九九| 国产精品一区二区免费福利视频| 日韩精品亚洲专区| 91九色综合| 精品国产乱码| 久久久噜噜噜| 亚洲黄页一区| 亚州av日韩av| 精品视频网站| 精品欧美激情在线观看|