2022-03-10

这就是Fork/Join任务的原理:判断一个任务是否足够小,如果是,直接计算,否则,就分拆成几个小任务分别计算。这个过程可以反复“裂变”成一系列小任务。

我们来看如何使用Fork/Join对大数据进行并行求:

public class SumTask extends RecursiveTask {
    static final int THRESHOLD = 5;
    int start = 0;
    int end = 0;

    public SumTask(int start, int end) {
        this.start = start;
        this.end = end;
    }

    @Override
    protected Integer compute() {
        int sum = 0;
        if ((end-start)<=THRESHOLD){
            for (int i =start;i<=end;i++){
                sum=sum+i;
            }
            return sum;
        }
        int mid = (end+start)/2;
        SumTask task1 = new SumTask(start,mid);
        SumTask task2 = new SumTask(mid+1,end);
        invokeAll(task1,task2);
        int r1 = task1.join();
        int r2 = task2.join();
        return r1+r2;
    }

    public static void main(String[] args) {
        ForkJoinTask task= new SumTask(0,10);
        System.out.println(ForkJoinPool.commonPool().invoke(task));
        System.out.println(task);
  Long sum =  LongStream.rangeClosed(0L, 3L).parallel().reduce(0, Long::sum);
 reduce的第一个初始值如过按照并行流parallel计算的话,会根据计算机的核数每次都多加一个初始值

    }

你可能感兴趣的:(2022-03-10)