日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java线程Fork/Join思想及实现

發(fā)布時間:2025/3/11 java 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java线程Fork/Join思想及实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

最近在看線程這一塊的東西,所以之前的那篇文章就是用來記錄的,但看起來好簡單的樣子,哈哈哈!

這兩天看的是Fork/Join?分而治之的思想,Doug Lea大師的JUC還是挺強(qiáng)的,學(xué)并發(fā)編程應(yīng)該沒有人不知道這個大佬吧!

上篇少記錄了一個東西,叫守護(hù)線程,即Thread.setDaemon(boolean on);當(dāng)參數(shù)為false的時候,沒有意思,當(dāng)參數(shù)為true的時候,即調(diào)用該方法的線程與當(dāng)前的線程共生死,就是當(dāng)前線程結(jié)束了后無論調(diào)用setDeamon(true)的線程是否結(jié)束,它都會結(jié)束;這個這么看起來雖然用處不大,但是在使用單元測試的時候,即junit測試,使用@Test進(jìn)行測試線程時,當(dāng)測試線程走完后,調(diào)用的線程都會結(jié)束,就是因為守護(hù)線程的存在,導(dǎo)致會出現(xiàn)這樣的現(xiàn)象;所以在測試線程的時候盡量不要使用junit單元測試,還是使用main方法測試比較好。

現(xiàn)在開始談?wù)凢ork/Join啦,分而治之,就是將一個大任務(wù)拆分到多個小任務(wù),然后小任務(wù)同時執(zhí)行,執(zhí)行完后將每個小任務(wù)運(yùn)算結(jié)果進(jìn)行合并,這樣能夠加快程序運(yùn)行的速度。像這種分而治之的思想在歸并排序算法中能體現(xiàn)出來。

Fork/Join的使用標(biāo)準(zhǔn)范式:

ForkJoinPool pool = new ForkJoinPool(); ForkJoinTask task = new ForkJoinTask(); pool.invoke(task); Result = task.join();

ForkJoinPool其實是個線程池繼承自JDK的線程池ExecutorService,說白就是多線程執(zhí)行多個任務(wù),然后將結(jié)果進(jìn)行合并預(yù)算,來提升程序的運(yùn)行的速度

ForkJoinTask主要有兩個常用的實現(xiàn)類RecursiveAction以及RecursiveTask<T>?即一個是同步帶有返回值的,后面那個異步不帶有返回值的

RecursiveTask<T>的使用示例:

class UseRecursiveTask extends RecursiveTask<T> {protected T compute(){//do something...UseRecursiveTask task1 = new UseRecursiveTask();UseRecursiveTask task2 = new UseRecursiveTask();invokeAll(task1,task2);//再次調(diào)用task1和task2的compute()方法return task1.join() + task2.join();//阻塞并等待獲取結(jié)果值} } //主方法 public static void main(String [] arg0){ForkJoinPool pool = new ForkJoinPool();UseRecursiveTask task = new UseRecursiveTask<T>();pool.invoke(task);T result = task.join();//開始執(zhí)行,進(jìn)入阻塞,等待拆分任務(wù)全部執(zhí)行。//do something... }

RecursiveAction的使用示例:

class UseRecursiveAction extends RecursiveAction {protected void compute(){//do something...UseRecursiveAction action1 = new UseRecursiveAction();UseRecursiveAction action2 = new UseRecursiveAction();List<UseRecursiveAction> list = new ArrayList<UseRecursiveAction>();list.add(action1);list.add(action2);Collection<UseRecursiveAction> collection = invokeAll(list);for(UseRecursiveAction action : collection){action.join();//異步執(zhí)行}} } //主線程 public static void main(String [] arg0){ForkJoinPool pool = new ForkJoinPool();UseRecursiveAction action = new UseRecursiveAction();pool.execute(action);//開始異步執(zhí)行//這里可執(zhí)行其他業(yè)務(wù)邏輯//....action.join();//進(jìn)入阻塞狀態(tài),等待異步線程執(zhí)行完畢 }

上面就是兩種示例,在Fork/Join中其實還有一種思想叫工作密取(Worker-Stealing),就是空閑的線程會從繁忙線程的任務(wù)隊列中,從任務(wù)隊列后面獲取一個任務(wù)去執(zhí)行,在ForkJoinPool?中就已經(jīng)實現(xiàn)好了。

既然談到了這個,就簡單的看了一下源代碼,在ForkJoinPool?類中有個內(nèi)部類叫WorkQueue,維護(hù)了一個它的數(shù)組,用來儲存每個任務(wù)的,看了一下它的源代碼,感覺有點(diǎn)艱難,還是等下次變得更強(qiáng)的時候再研究吧!

?

總結(jié)

以上是生活随笔為你收集整理的Java线程Fork/Join思想及实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。