线程池工作线程ForkJoin的使用
作者:互联网
因为一些特别的需求让我认识到了这个的用处,用起来真的很巴适!
ForkJoin
- 对任务做拆分,ForkJoinPool,线程池newWorkStealingPool工作线程用到
Java中使用
//每个线程执行的区间长度
public static final Integer maxLen = 15;
static class TestForkJoinTask extends RecursiveTask<Integer> {
//开始值
int start;
//结束值
int end;
public TestForkJoinTask(int start, int end) {
this.start = start;
this.end = end;
}
@Override
protected Integer compute() {
if (this.end - this.start <= maxLen) {
//当前任务已经不够再拆分了 直接执行 比如做累计
int sum = 0;
for (int i = this.start; i <= this.end; i++) {
sum += i;
}
System.out.println("当前开始位置:" + this.start + ",结束位置:" + this.end + ",结果:" + sum);
return sum;
} else {
//平均拆分
TestForkJoinTask task = new TestForkJoinTask(this.start, (this.start + this.end) / 2);
task.fork();
TestForkJoinTask task1 = new TestForkJoinTask((this.start + this.end) / 2 + 1, this.end);
task1.fork();
return task.join() + task1.join();
}
}
}
public static void main(String[] args) throws ExecutionException, InterruptedException {
ForkJoinPool forkJoinPool = new ForkJoinPool();
//给池子里提交一个任务 用任务拆分来计算1+2+...100
ForkJoinTask<Integer> submit = forkJoinPool.submit(new TestForkJoinTask(1, 100));
Integer integer = submit.get();
System.out.println("累加结果:" + integer);
}
//结束结果
当前开始位置:1,结束位置:13,结果:91
当前开始位置:26,结束位置:38,结果:416
当前开始位置:51,结束位置:63,结果:741
当前开始位置:64,结束位置:75,结果:834
当前开始位置:39,结束位置:50,结果:534
当前开始位置:14,结束位置:25,结果:234
当前开始位置:89,结束位置:100,结果:1134
当前开始位置:76,结束位置:88,结果:1066
累加结果:5050
源码就不分析了,前面的J.U.C工具类和线程池源码结合起来看一遍,大同小异
以上就是本章的全部内容了。
上一篇:一文带你熟透Java线程池的使用及源码
下一篇:最详细Java中动态代理分析-- Proxy
书到用时方恨少,事非经过不知难
标签:end,int,位置,start,线程,使用,TestForkJoinTask,ForkJoin 来源: https://blog.csdn.net/qq_35551875/article/details/121701627