Java並發編程之Fork/Join框架的理解
一、Fork/Join框架的理解
- ForkJoinTask類屬於java.util.concurrent 包下;
- ForkJoinTask類下有2個子類,分別為RecursiveTask和RecursiveAction類;(lz示例中使用RecursiveTask類進行重寫compute()方法進行實現數值的累加計算)
- ForkJoinTask類 將一個大的任務拆分成多個子任務進行並行處理,最後將子任務結果合並成最後的計算結果,並進行輸出。
二、Fork/Join框架使用示例
示例場景:對數值進行累加計算;
註:示例中使用ForkJoinTask類的子類(RecursiveTask類)進行重寫compute()方法進行實現數值的累加計算
1、代碼
package com.xz.thread.ForkJoin; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; import java.util.concurrent.RecursiveTask; /** * @description: * @author: xz * @create: 2021-06-06 17:15 */ public class Demo extends RecursiveTask<Integer> { private int start;//子任務開始計算的開始值 private int end;//子任務開始計算的結束值 private static final Integer MAX_VALUE = 50; //構造方法 public Demo(int start, int end) { this.start = start; this.end = end; } //計算 @Override protected Integer compute() { int sum =0; //如果所需要計算的數值拆分為足夠小,則進行累加計算 if(end-start <= MAX_VALUE){ System.out.println("startValue = " + start + ";endValue = " + end); for(int i=start;i<=end;i++){ sum +=i; } }else{//否則再進行任務拆分,拆分成2個子任務 Demo d1 = new Demo(start, (start + end) / 2); Demo d2 = new Demo((start + end) / 2, end); //執行2個子任務 d1.fork(); d2.fork(); //合並子任務 Integer value1= d1.join(); Integer value2= d2.join(); sum =value1+value2; } return sum; } //測試 public static void main(String[] args) throws Exception{ //ForkJoinPool主要用於實現“分而治之”的算法,特別是分治之後遞歸調用的函數 ForkJoinPool forkJoinPool = new ForkJoinPool(); //提交一個ForkJoinTask執行 ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(new Demo(1,200)); System.out.println("計算結果="+forkJoinTask.get()); } }
2、運行測方法,輸出如下:
3、結論:
由第2步驟的輸出結果可知,先把1到200的所有數值進行任務拆分(上圖拆分成瞭4部分),然後再將所有子任務結的果合並成最後的計算結果
到此這篇關於Java並發編程之Fork/Join框架的理解的文章就介紹到這瞭,更多相關Fork/Join框架的理解內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Java多線程高並發中的Fork/Join框架機制詳解
- Java並發中的Fork/Join 框架機制詳解
- Java 並發編程之ForkJoin框架
- 輕輕松松吃透Java並發fork/join框架
- Java並行處理的實現