Java多線程高并發(fā)中的Fork/Join框架機制詳解
1.Fork/Join框架簡介
Fork/Join 它可以將一個大的任務(wù)拆分成多個子任務(wù)進行并行處理,最后將子任務(wù)結(jié)果合并成最后的計算結(jié)果,并進行輸出。Fork/Join 框架要完成兩件事情:
Fork:把一個復雜任務(wù)進行分拆,大事化小 :把一個復雜任務(wù)進行分拆,大事化小
Join:把分拆任務(wù)的結(jié)果進行合并

在 Java 的 Fork/Join 框架中,使用兩個類完成上述操作:
ForkJoinTask: 我們要使用 Fork/Join 框架,首先需要創(chuàng)建一個 ForkJoin 任務(wù)。該類提供了在任務(wù)中執(zhí)行 fork 和 join 的機制。通常情況下我們不需要直接集成 ForkJoinTask 類,只需要繼承它的子類,F(xiàn)ork/Join 框架提供了兩個子類:
- RecursiveAction:用于沒有返回結(jié)果的任務(wù)
- RecursiveTask:用于有返回結(jié)果的任務(wù)
ForkJoinPool: ForkJoinTask 需要通過 ForkJoinPool 來執(zhí)行。
RecursiveTask: 繼承后可以實現(xiàn)遞歸(自己調(diào)自己)調(diào)用的任務(wù)。
可以在jdk官方文檔中看到:

2.簡單應(yīng)用
實現(xiàn)從 1 + 2 + ... + 100 ,將它們拆分成多個小任務(wù),分別求和,最終再將這些結(jié)果合并。
這里就是參照官方文檔,先繼承RecursiveTask類,重寫其中的compute方法,然后定義有參構(gòu)造,而ForkJoinTask需要通過 ForkJoinPool 來執(zhí)行,所以還需要創(chuàng)建 分支合并池ForkJoinPool對象。
package test.forkjoin;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;
/**
*
*/
class MyTask extends RecursiveTask<Integer> {
//拆分差值不能超過10,每次計算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,進一步拆分
//獲取中間值
int middle = (begin + end) / 2;
//拆分的左區(qū)間
MyTask taskLeft = new MyTask(begin,middle);
//拆分的右區(qū)間
MyTask taskRight = new MyTask(middle + 1,end);
//fork方法進行拆分
taskLeft.fork();
taskRight.fork();
//join方法進行合并
result = taskLeft.join() + taskRight.join();
}
return result;
}
}
public class ForkJoinDemo {
public static void main(String[] args) {
//創(chuàng)建MyTask對象
MyTask myTask = new MyTask(1,100);
//創(chuàng)建分支合并池對象
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)閉池對象
forkJoinPool.shutdown();
}
}
}

到此這篇關(guān)于Java多線程高并發(fā)中的Fork/Join框架機制詳解的文章就介紹到這了,更多相關(guān)Java Fork/Join 框架內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)PPT格式文件上傳并在線預覽功能
本文介紹SpringBoot實現(xiàn)PPT格式文件上傳并在線預覽功能,通過上傳接口,可在C盤的tempfile目錄下找到上傳的文件,預覽時會在同級目錄下創(chuàng)建一個相同文件名后綴為pdf的文件,每次預覽會先查找文件是否存在,存在則直接預覽,不存在則會走上面的處理,需要的朋友可以參考下2022-02-02
Spring?Boot自定義Starter組件開發(fā)實現(xiàn)配置過程
SpringBoot中的starter是一種非常重要的機制,能夠拋棄以前繁雜的配置,將其統(tǒng)一集成進?starter,應(yīng)用者只需要在maven中引入starter依賴,這篇文章主要介紹了Spring?Boot自定義Starter組件開發(fā)實現(xiàn),需要的朋友可以參考下2022-06-06
SpringBoot實現(xiàn)自定義條件注解的代碼示例
在Spring Boot中,條件注解是一種非常強大的工具,它可以根據(jù)特定的條件來選擇是否加載某個類或某個Bean,文將介紹如何在Spring Boot中實現(xiàn)自定義條件注解,并提供一個示例代碼,需要的朋友可以參考下2023-06-06
深入理解Spring事務(wù)及傳播機制之原理解析與實際應(yīng)用
Spring事務(wù)管理機制提供了多種傳播行為,可以控制事務(wù)的范圍和隔離級別,保證數(shù)據(jù)一致性和完整性。在實際應(yīng)用中,需要根據(jù)具體業(yè)務(wù)場景選擇合適的傳播行為實現(xiàn)事務(wù)控制2023-04-04
mybatis-plus主鍵id生成、字段自動填充的實現(xiàn)代碼
這篇文章主要介紹了mybatis-plus主鍵id生成、字段自動填充的實現(xiàn)代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
SpringMVC使用MultipartResolver實現(xiàn)文件上傳
MultipartResolver 用于處理文件上傳,當收到請求時 DispatcherServlet 的 checkMultipart() 方法會調(diào)用 MultipartResolver 的 isMultipart() 方法判斷請求中是否包含文件2023-02-02
JavaWeb中Tomcat底層機制和Servlet運行原理詳解
這篇文章主要介紹了JavaWeb中Tomcat底層機制和Servlet運行原理詳解,Tomcat是一個開源的Java Web服務(wù)器,它是基于Java Servlet和JavaServer Pages(JSP)技術(shù)的,下面是關(guān)于Tomcat底層機制和Servlet運行原理的簡要說明,需要的朋友可以參考下2023-10-10

