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];
public static ForkJoinPool forkJoinPool = new ForkJoinPool();
public static void main(String[] args) {
for (int i=0;i<ints.length;i++){
ints[i] = i+1;
}
Long l = forkJoinPool.invoke(new MyTask(0,ints.length-1));
System.out.println(l);
}
}
class MyTask extends RecursiveTask
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;
}
}
}
```