Java多線程高並發中的Fork/Join框架機制詳解

1.Fork/Join框架簡介

Fork/Join 它可以將一個大的任務拆分成多個子任務進行並行處理,最後將子任務結果合並成最後的計算結果,並進行輸出。Fork/Join 框架要完成兩件事情:

Fork:把一個復雜任務進行分拆,大事化小 :把一個復雜任務進行分拆,大事化小

Join:把分拆任務的結果進行合並

在 Java 的 Fork/Join 框架中,使用兩個類完成上述操作:

ForkJoinTask: 我們要使用 Fork/Join 框架,首先需要創建一個 ForkJoin 任務。該類提供瞭在任務中執行 fork 和 join 的機制。通常情況下我們不需要直接集成 ForkJoinTask 類,隻需要繼承它的子類,Fork/Join 框架提供瞭兩個子類:

  • RecursiveAction:用於沒有返回結果的任務
  • RecursiveTask:用於有返回結果的任務

ForkJoinPool: ForkJoinTask 需要通過 ForkJoinPool 來執行。

RecursiveTask: 繼承後可以實現遞歸(自己調自己)調用的任務。

可以在jdk官方文檔中看到:

2.簡單應用

實現從 1 + 2 + … + 100 ,將它們拆分成多個小任務,分別求和,最終再將這些結果合並。

這裡就是參照官方文檔,先繼承RecursiveTask類,重寫其中的compute方法,然後定義有參構造,而ForkJoinTask需要通過 ForkJoinPool 來執行,所以還需要創建 分支合並池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以內的連加操作
    private static final Integer NUMBER = 10;
    private int begin; //拆分左區間的值
    private int end; //拆分右區間的值
    private int result; //最終結果
 
    public MyTask(int begin,int end) {
        this.begin = begin;
        this.end = end;
    }
 
    @Override
    protected Integer compute() {
        //判斷區間差值是否大於10
        if ((end - begin) <= NUMBER) {
            //將區間內的值依次相加
            for (int i = begin; i <= end; i++) {
                result += i;
            }
        } else { //區間差值大於10,進一步拆分
            //獲取中間值
            int middle = (begin + end) / 2;
            //拆分的左區間
            MyTask taskLeft = new MyTask(begin,middle);
            //拆分的右區間
            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) {
        //創建MyTask對象
        MyTask myTask = new MyTask(1,100);
        //創建分支合並池對象
        ForkJoinPool forkJoinPool = new ForkJoinPool();
        ForkJoinTask<Integer> forkJoinTask = forkJoinPool.submit(myTask);
        try {
            //獲取最終合並後的結果
            Integer ans = forkJoinTask.get();
            System.out.println(ans);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            //關閉池對象
            forkJoinPool.shutdown();
        }
    }
}

到此這篇關於Java多線程高並發中的Fork/Join框架機制詳解的文章就介紹到這瞭,更多相關Java Fork/Join 框架內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: