Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解
1.Fork/Join框架簡(jiǎn)介
Fork/Join 它可以將一個(gè)大的任務(wù)拆分成多個(gè)子任務(wù)進(jìn)行并行處理,最后將子任務(wù)結(jié)果合并成最后的計(jì)算結(jié)果,并進(jìn)行輸出。Fork/Join 框架要完成兩件事情:
Fork:把一個(gè)復(fù)雜任務(wù)進(jìn)行分拆,大事化小 :把一個(gè)復(fù)雜任務(wù)進(jìn)行分拆,大事化小
Join:把分拆任務(wù)的結(jié)果進(jìn)行合并
在 Java 的 Fork/Join 框架中,使用兩個(gè)類完成上述操作:
ForkJoinTask: 我們要使用 Fork/Join 框架,首先需要?jiǎng)?chuàng)建一個(gè) ForkJoin 任務(wù)。該類提供了在任務(wù)中執(zhí)行 fork 和 join 的機(jī)制。通常情況下我們不需要直接集成 ForkJoinTask 類,只需要繼承它的子類,F(xiàn)ork/Join 框架提供了兩個(gè)子類:
- RecursiveAction:用于沒有返回結(jié)果的任務(wù)
- RecursiveTask:用于有返回結(jié)果的任務(wù)
ForkJoinPool: ForkJoinTask 需要通過 ForkJoinPool 來執(zhí)行。
RecursiveTask: 繼承后可以實(shí)現(xiàn)遞歸(自己調(diào)自己)調(diào)用的任務(wù)。
可以在jdk官方文檔中看到:
2.簡(jiǎn)單應(yīng)用
實(shí)現(xiàn)從 1 + 2 + ... + 100 ,將它們拆分成多個(gè)小任務(wù),分別求和,最終再將這些結(jié)果合并。
這里就是參照官方文檔,先繼承RecursiveTask類,重寫其中的compute方法,然后定義有參構(gòu)造,而ForkJoinTask需要通過 ForkJoinPool 來執(zhí)行,所以還需要?jiǎng)?chuàng)建 分支合并池ForkJoinPool對(duì)象。
package test.forkjoin; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; /** * */ class MyTask extends RecursiveTask<Integer> { //拆分差值不能超過10,每次計(jì)算10以內(nèi)的連加操作 private static final Integer NUMBER = 10; private int begin; //拆分左區(qū)間的值 private int end; //拆分右區(qū)間的值 private int result; //最終結(jié)果 public MyTask(int begin,int end) { this.begin = begin; this.end = end; } @Override protected Integer compute() { //判斷區(qū)間差值是否大于10 if ((end - begin) <= NUMBER) { //將區(qū)間內(nèi)的值依次相加 for (int i = begin; i <= end; i++) { result += i; } } else { //區(qū)間差值大于10,進(jìn)一步拆分 //獲取中間值 int middle = (begin + end) / 2; //拆分的左區(qū)間 MyTask taskLeft = new MyTask(begin,middle); //拆分的右區(qū)間 MyTask taskRight = new MyTask(middle + 1,end); //fork方法進(jìn)行拆分 taskLeft.fork(); taskRight.fork(); //join方法進(jìn)行合并 result = taskLeft.join() + taskRight.join(); } return result; } } public class ForkJoinDemo { public static void main(String[] args) { //創(chuàng)建MyTask對(duì)象 MyTask myTask = new MyTask(1,100); //創(chuàng)建分支合并池對(duì)象 ForkJoinPool forkJoinPool = new ForkJoinPool(); ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask); try { //獲取最終合并后的結(jié)果 Integer ans = forkJoinTask.get(); System.out.println(ans); } catch (Exception e) { e.printStackTrace(); }finally { //關(guān)閉池對(duì)象 forkJoinPool.shutdown(); } } }
到此這篇關(guān)于Java多線程高并發(fā)中的Fork/Join框架機(jī)制詳解的文章就介紹到這了,更多相關(guān)Java Fork/Join 框架內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能
本文介紹SpringBoot實(shí)現(xiàn)PPT格式文件上傳并在線預(yù)覽功能,通過上傳接口,可在C盤的tempfile目錄下找到上傳的文件,預(yù)覽時(shí)會(huì)在同級(jí)目錄下創(chuàng)建一個(gè)相同文件名后綴為pdf的文件,每次預(yù)覽會(huì)先查找文件是否存在,存在則直接預(yù)覽,不存在則會(huì)走上面的處理,需要的朋友可以參考下2022-02-02Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn)配置過程
SpringBoot中的starter是一種非常重要的機(jī)制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進(jìn)?starter,應(yīng)用者只需要在maven中引入starter依賴,這篇文章主要介紹了Spring?Boot自定義Starter組件開發(fā)實(shí)現(xiàn),需要的朋友可以參考下2022-06-06JVM加載class文件的原理機(jī)制實(shí)例詳解
Java是一種具有動(dòng)態(tài)性的解釋型語言,類(class)只有被加載到JVM后才能運(yùn)行,接下來通過本文給大家介紹JVM加載class文件的原理機(jī)制詳解,感興趣的朋友一起看看吧2022-04-04SpringBoot實(shí)現(xiàn)自定義條件注解的代碼示例
在Spring Boot中,條件注解是一種非常強(qiáng)大的工具,它可以根據(jù)特定的條件來選擇是否加載某個(gè)類或某個(gè)Bean,文將介紹如何在Spring Boot中實(shí)現(xiàn)自定義條件注解,并提供一個(gè)示例代碼,需要的朋友可以參考下2023-06-06深入理解Spring事務(wù)及傳播機(jī)制之原理解析與實(shí)際應(yīng)用
Spring事務(wù)管理機(jī)制提供了多種傳播行為,可以控制事務(wù)的范圍和隔離級(jí)別,保證數(shù)據(jù)一致性和完整性。在實(shí)際應(yīng)用中,需要根據(jù)具體業(yè)務(wù)場(chǎng)景選擇合適的傳播行為實(shí)現(xiàn)事務(wù)控制2023-04-04詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn)
很多人在使用MyBatis的緩存后經(jīng)常會(huì)遇到MySQL分頁查詢的顯示問題,針對(duì)于此,這里我們就來詳解Java的MyBatis框架中的緩存與緩存的使用改進(jìn),首先來回顧一下MyBatis的緩存機(jī)制與執(zhí)行:2016-06-06mybatis-plus主鍵id生成、字段自動(dòng)填充的實(shí)現(xiàn)代碼
這篇文章主要介紹了mybatis-plus主鍵id生成、字段自動(dòng)填充的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-12-12SpringMVC使用MultipartResolver實(shí)現(xiàn)文件上傳
MultipartResolver 用于處理文件上傳,當(dāng)收到請(qǐng)求時(shí) DispatcherServlet 的 checkMultipart() 方法會(huì)調(diào)用 MultipartResolver 的 isMultipart() 方法判斷請(qǐng)求中是否包含文件2023-02-02JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解
這篇文章主要介紹了JavaWeb中Tomcat底層機(jī)制和Servlet運(yùn)行原理詳解,Tomcat是一個(gè)開源的Java Web服務(wù)器,它是基于Java Servlet和JavaServer Pages(JSP)技術(shù)的,下面是關(guān)于Tomcat底層機(jī)制和Servlet運(yùn)行原理的簡(jiǎn)要說明,需要的朋友可以參考下2023-10-10