ForkJoin在jdk1.7出现的,并行执行任务,提高效率
1.把大任务拆成小任务,然后汇总结果
2.特点:工作窃取(A,B两个线程,A执行完会把B的某些任务投过去执行)
3.底层:双端队列
4.使用
第一步:通过forkjoinpool来执行
第二步:计算任务forkjoinpool
第三步:计算类要继承ForkJoinTask的子类
public class ForkJoinDemo extends RecursiveTask<Long> {
private Long statrt;
private Long end;
private Long temp = 1000L; // 临界值,当end-start超过某个值才拆分任务
// 有参构造
@Override
public Long compute() {
if(end-start <= temp) { // 大于临界值,就走FoekJoin
// 正常的for循环
} else {
long middle = start + (start + end )/2; // 中间值
ForkJoinDemo task1 = new ForkJoinDemo(start, middle);
task1.fork(); // 拆分任务,吧任务亚茹线程队列
ForkJoinDemo task2 = new ForkJoinDemo(middle+1, end);
task2 .fork();
return task1.join()+task2.join(); // 得到任务结果
}
}
}
ForkJoinTask有子类:
1.RecursiveAction 递归事件 没有返回值
2.RecursiveTask 递归任务 有返回值