shigen
坚持更新文章的博客写手,擅长Java、python、vue、shell等编程语言和各种应用程序、脚本的开发。记录成长,分享认知,留住感动。 个人IP:shigen
在上一篇的文章java 多线程+分治求和,太牛了的文章中,提到了forkjoin
,在一番了解之后,发现这个forkjoin
基本上和线程池差不多
Fork/Join框架的核心思想是将大任务拆分成若干个小任务(Fork),然后并行执行这些小任务,最后将它们的结果合并(Join)。这样可以充分利用多核处理器的性能,提高任务的执行效率。
在一些论坛上网友也回复:大数据的认识这个。也是啊,没准吊打我的面试官就是搞大数据的呢。正常的Java开发,哪来的这么多需要运算的任务,大部分都是IO型的任务,参考文章Excel导入导出百万级数据优化。
写了一点代码测试了一下效果,选用的还是经典的大序列求和案例:
public class SumCalculator extends RecursiveTask<Long> {
private static final long serialVersionUID = 1L;
// 阈值,超过这个值则拆分任务
private static final long THRESHOLD = 10000;
private final long start;
private final long end;
public SumCalculator(long start, long end) {
this.start = start;
this.end = end;
}
@Override
protected Long compute() {
long length = end - start;
if (length <= THRESHOLD) {
return computeSequentially();
}
long middle = (start + end) >>> 1;
SumCalculator leftTask = new SumCalculator(start, middle);
SumCalculator rightTask = new SumCalculator(middle + 1, end);
// 拆分左边任务
leftTask.fork();
// 拆分右边任务
rightTask.fork();
// 合并并返回结果
return leftTask.join() + rightTask.join();
}
private long computeSequentially() {
long sum = 0;
for (long i = start; i <= end; i++) {
sum += i;
}
return sum;
}
public static void main(String[] args) {
long start = 1;
long end = 1_0000_0000;
StopWatch stopWatch = new StopWatch();
stopWatch.start();
ForkJoinPool forkJoinPool = new ForkJoinPool();
long result = forkJoinPool.invoke(new SumCalculator(start, end));
stopWatch.stop();
System.out.println("Sum of " + start + " to " + end + " = " + result);
System.out.println("Elapsed time: " + stopWatch.getTotalTimeMillis() + " ms");
}
}
运行时间我们来对比一下:
普通线程池:
多次运行后发现:时间在100ms-300ms之间波动。
总的来说,fork/join
的效率至少要比普通线程池提交任务运行耗时减少50%左右。
最后,借助魔法和个人理解,来一波总结:
Fork/Join适用场景:
注意事项:
ForkJoinPool
,也可以根据需要创建自定义的线程池。总的来说,Fork/Join框架适用于需要并行执行递归式任务且任务之间不存在太多依赖关系的情况,能够充分利用多核处理器的性能,提高任务的执行效率。
好了,底层原理还是比较复杂,推荐观看视频:6.8 并发编程之ForkJoin工作原理分析。搞不明白,在这里就不深入分析底层原理了。
*与shigen一起,每天不一样!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。