fork — 分叉
    join — 合并

    具体代码
    fork()方法,基于当前任务线程,再分叉出新的处理线程,同时执行处理任务。
    join() 方法,等待任务执行的结果

    递归加callable 也能做到以下的表面效果。 ForkJoin其真正的意义在于如下

    • 其使用ForkJoinWorkerThread做任务执行,每个线程都有单独的任务等待队列,不同于之前线程池共享任务队列,避免线程的竞争任务的问题。
    • 同时如果有空余线程时,会从繁忙线程任务尾部窃取任务进行处理
    • 关键在于其封装了完整Fork/Join 框架,对资源自适配的优化运用,及执行流程自动优化。 调用者只需简单的声明ForkJoinPool,同时做好任务的基本递归拆分和处理返回值。 ```java package com.conpany.project.testForkJoin;

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

    public class Main { public static int[] ints = new int[100000];

    1. public static ForkJoinPool forkJoinPool = new ForkJoinPool();
    2. public static void main(String[] args) {
    3. for (int i=0;i<ints.length;i++){
    4. ints[i] = i+1;
    5. }
    6. Long l = forkJoinPool.invoke(new MyTask(0,ints.length-1));
    7. System.out.println(l);
    8. }

    }

    class MyTask extends RecursiveTask{ int stratPoint; int endPoint;

    public MyTask(int startPoint ,int endPoint){
        this.stratPoint = startPoint;
        this.endPoint = endPoint;
    }
    
    @Override
    protected Long compute() {
        if(endPoint - stratPoint>100){ //递归终止条件
            System.out.println("拆分");
            //拆分递归
            int middle = (endPoint+stratPoint)/2;
            MyTask m1 = new MyTask(stratPoint,middle);
            MyTask m2  = new MyTask(middle+1,endPoint);
            //分叉
            m1.fork();
            m2.fork();
            //汇总
            return m1.join()+m2.join();
        }else{
            System.out.println("计算");
            long partSum = 0;
            for (int i = stratPoint; i<=endPoint ;i++){
                partSum += Main.ints[i];
            }
            return partSum;
        }
    }
    

    }

    ```