Java線程Fork/Join思想及實現

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

這兩天看的是Fork/Join?分而治之的思想,Doug Lea大師的JUC還是挺強的,學并發編程應該沒有人不知道這個大佬吧!

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

現在開始談談Fork/Join啦,分而治之,就是將一個大任務拆分到多個小任務,然后小任務同時執行,執行完后將每個小任務運算結果進行合并,這樣能夠加快程序運行的速度。像這種分而治之的思想在歸并排序算法中能體現出來。

Fork/Join的使用標準范式:

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

ForkJoinPool其實是個線程池繼承自JDK的線程池ExecutorService,說白就是多線程執行多個任務,然后將結果進行合并預算,來提升程序的運行的速度

ForkJoinTask主要有兩個常用的實現類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);//再次調用task1和task2的compute()方法return task1.join() + task2.join();//阻塞并等待獲取結果值}
}
//主方法
public static void main(String [] arg0){ForkJoinPool pool = new ForkJoinPool();UseRecursiveTask task = new UseRecursiveTask<T>();pool.invoke(task);T result = task.join();//開始執行,進入阻塞,等待拆分任務全部執行。//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();//異步執行}}
}
//主線程
public static void main(String [] arg0){ForkJoinPool pool = new ForkJoinPool();UseRecursiveAction action = new UseRecursiveAction();pool.execute(action);//開始異步執行//這里可執行其他業務邏輯//....action.join();//進入阻塞狀態,等待異步線程執行完畢
}

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

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

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537183.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537183.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537183.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Sgen.exe: Speed up XmlSerializer's Startup Performance [.NET 2.0, XML Serialization]

Sgen.exe: Speed up XmlSerializers Startup Performance [.NET 2.0, XML Serialization] Written by Allen Lee 1. Why Sgen.exe? 在《Serialize Your Deck with Positron [XML Serialization, XSD, C#]》一文中&#xff0c;我們領略到 XML Serialization 是如何簡化我們的 X…

Java線程并發常用工具類使用

這次整理了一些比較常用的線程工具類啦。 CountDownLatch&#xff1a;在一組線程執行完后&#xff0c;才能開始執行調用等待的線程。上片文章提到過junit的測試盡量不要測試線程&#xff0c;如果硬是要可以使用CountDownLatch進行測試 CyclicBarrier&#xff1a;在一組線程中…

三維圖形幾何變換算法實驗_計算機視覺方向簡介 | 深度學習視覺三維重建

點擊上方“計算機視覺life”&#xff0c;選擇“星標”快速獲得最新干貨作者&#xff1a; Moonsmilehttps://zhuanlan.zhihu.com/p/79628068本文已由作者授權&#xff0c;未經允許&#xff0c;不得二次轉載三維重建意義三維重建作為環境感知的關鍵技術之一&#xff0c;可用于自動…

讀《高效程序員的45個習慣——敏捷開發修煉之道》

本書主要用平易的語言講述了45個有助于提高程序員自身敏捷的習慣&#xff0c;個人感覺這種老外寫的書翻譯成中文就少了很多意思。 主要的45個習慣是&#xff1a; 做事欲速則不達對事不對人排除萬難跟蹤變化對團隊投資懂得丟棄打破沙鍋問到底把握開發節奏讓客戶做決定讓設計指導…

Java線程CAS原子操作

這次分享一些關于原子操作(CAS)的東西. 定義 CAS(Compare And Swap)是CPU的一個指令級別的操作&#xff0c;叫原子操作&#xff0c;原子操作是不可分割的&#xff0c;跟事務差不多&#xff0c;要么全部執行完成&#xff0c;要么不執行&#xff1b; 像這種操作有點類似阻塞鎖…

python 導航欄_解析導航欄的url--selnium,beautifulsoup實戰

前段時間做ui自動化測試的時候&#xff0c;導航欄菜單始終有點問題&#xff0c;最后只好直接獲取到url&#xff0c;然后直接使用driver.get(url)進入頁面&#xff1b;包括做壓測的時候&#xff0c;比如我要找出所有報表菜單的url&#xff0c;這樣不可能手動去一個一個找出來&am…

PNG圖片詳解

1、PNG圖片類型 PNG格式有8位、24位、32位三種&#xff0c;下面是一些術語&#xff1a; 索引透明&#xff1a;類似于GIF&#xff0c;某一像素只有全透和全不透明兩種效果Alpha透明&#xff1a;半透明PNG8 8位的PNG最多支持256&#xff08;2的8次方&#xff09;種顏色&#xff0…

Java并發編程之顯式鎖(Lock)使用

又是一個基于AQS好用的類&#xff0c;看來下次有必要看看AQS了&#xff0c;正好又是放假。 既然叫顯式鎖&#xff0c;必然也有隱式鎖&#xff0c;也就是所謂的synchronzied關鍵字&#xff0c;它們兩者的區別呢在于使用范圍&#xff0c;synchronzied關鍵字的使用范圍比Lock要小…

python pychart三維_詳解python模塊pychartdir安裝及導入問題

在遷移別人寫好的腳本時&#xff0c;發現pychartdir沒有導入&#xff0c;腳本執行報錯。以下是報錯內容&#xff1a;[modpsLGJF-ZYC5-MMSC-WEB02 ~]$ python /opt/aspire/product/modps/mopps/shell/dayreport_linux.py/etc/host.conf: line 1: bad command nospoof on"Tr…

vim 中Ctags的安裝和使用

Ctags是一個用來為源文件中的標識符&#xff08;如變量、函數、類成員、宏定義等&#xff09;創建索引文件的程序。這些tags文件能被編輯器或其它工具用來快速查找定位源代碼中的符號&#xff08;tag/symbol&#xff09;&#xff0c;如變量名&#xff0c;函數名等。 Tags文件中…

Java并發編程之AbstractQueuedSynchronizer(AQS)源碼解析

自己一個人隨便看看源碼學習的心得&#xff0c;分享一下啦&#xff0c;不過我覺得還是建議去買本Java并發編程的書來看會比較好點&#xff0c;畢竟個人的理解有限嘛。 獨占鎖和共享鎖 首先先引入這兩個鎖的概念&#xff1a;獨占鎖即同一時刻只有一個線程才能獲取到鎖&#xf…

采集用python還是火車頭_我才知道爬蟲也可以醬紫--火車采集器

我才知道爬蟲還可以這樣—火車采集器的使用說在前面額。。。好吧&#xff0c;我這一個三毛錢的屌絲也開始步入實習階段了&#xff0c;在北京其實也挺好的&#xff0c;雖說壓力大&#xff0c;但是今后就業機會也相對而言大一些。好了&#xff0c;說回今天的主題&#xff0c;之前…

mvn 使用中的錯誤

出現這種錯誤的時候&#xff1a;mvn Error building POM may not be this projects POM&#xff0c;報的是那個jar 包&#xff0c;就刪除那個jar 包&#xff0c;重新mvn clean install .ok

Java并發編程之FutureTask源碼解析

上次總結一下AQS的一些相關知識&#xff0c;這次總結了一下FutureTask的東西&#xff0c;相對于AQS來說簡單好多呀 之前提到過一個LockSupport的工具類&#xff0c;也了解一下這個工具類的用法&#xff0c;這里也鞏固一下吧 /*** Makes available the permit for the given th…

java 刪除二維數組中的null_避免在Java中檢查Null語句

1.概述通常&#xff0c;在Java代碼中處理null變量、引用和集合很棘手。它們不僅難以識別&#xff0c;而且處理起來也很復雜。事實上&#xff0c;在編譯時無法識別處理null的任何錯誤&#xff0c;會導致運行時NullPointerException。在本教程中&#xff0c;我們將了解在Java中檢…

Java并發編程之并發容器ConcurrentHashMap(JDK1.7)解析

最近看了一下ConcurrentHashMap的相關代碼&#xff0c;感覺JDK1.7和JDK1.8差別挺大的&#xff0c;這次先看下JDK1.7是怎么實現的吧 哈希&#xff08;hash&#xff09; 先了解一下啥是哈希&#xff08;網上有很多介紹&#xff09;&#xff0c;是一種散列函數&#xff0c;簡單來…

帶控制端的邏輯運算電路_分別完成正整數的平方、立方和階乘的運算verilog語言...

練習&#xff1a;設計一個帶控制端的邏輯運算電路&#xff0c;分別完成正整數的平方、立方和階乘的運算。 //--------------myfunction---------- modulemyfunction(clk,n,result,reset,sl); output[6:0]result; input[2:0] n; input reset,clk; input [1:0] sl; reg[6:0]resul…

Java并發編程之并發容器ConcurrentHashMap(JDK1.8)解析

這個版本ConcurrentHashMap難度提升了很多&#xff0c;就簡單的談一下常用的方法就好了&#xff0c;可能有些講的不太清楚&#xff0c;麻煩發現的大佬指正一下 主要數據結構 1.8將Segment取消了&#xff0c;保留了table數組的形式&#xff0c;但是不在以HashEntry純鏈表的形式…

simulink顯示多個數據_如何在 Simulink 中使用 PID Tuner 進行 PID 調參?

作者 | 安布奇責編 | 胡雪蕊出品 | CSDN(ID: CSDNnews)本文為一篇技術干貨&#xff0c;主要講述在Simulink如何使用PID Tuner進行PID調參。PID調參器( PIDTuner)概述1.1 簡介使用PID Tuner可以對Simulink模型中的PID控制器&#xff0c;離散PID控制器&#xff0c;兩自由度PID控制…

Java并發編程之堵塞隊列介紹以及SkipList(跳表)

堵塞隊列 先了解一下生產者消費者模式&#xff1a; 生產者就是生產數據的一方&#xff0c;消費者就是消費數據的另一方。在多線程開發中&#xff0c;如果生產者處理速度很快&#xff0c;而消費者處理速度很慢&#xff0c;那么生產者就必須等待消費者處理完&#xff0c;才能繼…