JUC:12. 分支合併框架

原理:

Fork:把一個複雜任務進行分拆,大事化小
Join:把分拆任務的結果進行合併
java

相關類

ForkJoinPool

分支合併池 類比=> 線程池
ide

ForkJoinTask

ForkJoinTask 類比=> FutureTaskthis

RecursiveTask

遞歸任務:繼承後能夠實現遞歸(本身調本身)調用的任務spa



示例1:線程

class Fibonacci extends RecursiveTask<Integer> {
    final int n;
    Fibonacci(int n) { this.n = n; }
    public Integer compute() {
        if (n <= 1)
            return n;
        Fibonacci f1 = new Fibonacci(n - 1);
        f1.fork();
        Fibonacci f2 = new Fibonacci(n - 2);
        return f2.compute() + f1.join();
    }
}

實例代碼

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveTask;

class MyTask extends RecursiveTask<Integer> {

    private static final Integer ADJUST_VALUE = 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個數之內的不用ForkJoin
        if((end-begin)<=ADJUST_VALUE){
            for (int i = begin; i <= end; i++) {
                result=result+i;
            }
        }else{
            int middle=(end+begin)/2;
            MyTask task01=new MyTask(begin,middle);
            MyTask task02=new MyTask(middle+1,end);
            task01.fork();
            task02.fork();
            result=task01.join()+task02.join();
        }

        return result;
    }
}

/**
 * 分支合併例子
 * ForkJoinPool
 * ForkJoinTask
 * RecursiveTask
 */
public class ForkJoinDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        MyTask myTask=new MyTask(0,100);
        ForkJoinPool threadPool=new ForkJoinPool();
        ForkJoinTask<Integer> forkJoinTask = threadPool.submit(myTask);

        Integer result   = forkJoinTask.get();
        System.out.println(result);
        threadPool.shutdown();

        //ForkJoinPool;
        //ForkJoinTask;
    }
}
相關文章
相關標籤/搜索