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!

推薦閱讀: