一、ForkJoinPool简介
ForkJoinPool:以拆分合并为核心的线程池,执行ForkJoinTask类型任务,两个类继承RecursiveAction(无返回值递归),RecursiveTask(有返回值递归)。ForkJoinPool中每个工作线程自己维护一个任务队列,当自己任务队列任务执行完,会从其他工作线程的任务队列取任务执行。ForkJoinPool是ExecutorService的扩展,更适合的是计算量大的任务。
二、代码示例
分别用迭代和ForkJoinPool 累加1-100000000的和:
public class ForkJoinPoolTest {
public static void main(String[] args) {
//1-10000000的数组
long[] num = LongStream.rangeClosed(1,100000000L).toArray();
long start = System.currentTimeMillis();
long sum = 0;
for (int i = 0; i < num.length; i++) {
sum += num[i];
}
System.out.println(sum + "耗时:" + (System.currentTimeMillis()-start));
long startfork= System.currentTimeMillis();
ForkJoinPool forkJoinPool = new ForkJoinPool();
Sumtask sumtask = new Sumtask(1,100000000L);
forkJoinPool.execute(sumtask);
System.out.println(sumtask.join() + "耗时:" + (System.currentTimeMillis()-startfork));
}
//RecursiveTask<V> 继承了 ForkJoinTask<V>
static class Sumtask extends RecursiveTask<Long>{
long start;
long end;
Sumtask(long start,long end){
this.start = start;
this.end = end;
}
//实现RecursiveTask的执行约定
@Override
protected Long compute() {
//小于直接计算
if(end -start <10000000){
long sum = 0;
for (long i = start; i <= end; i++) {
sum += i;
}
return sum;
}else{
//大于1000 递归拆分任务
long middle = (start+end)/2;
Sumtask leftSum = new Sumtask(start,middle);
Sumtask rightSum = new Sumtask(middle+1,end);
//提交任务
leftSum.fork();
rightSum.fork();
return leftSum.join() + rightSum.join();
}
}
}
执行结果图: