Java ForkJoinPool与非递归任务,工作窃取工作工作吗?
我想通过一种方法将任务提交到ForkJoinPool中:Runnable
forkJoinPool.submit(Runnable task)
请注意,我使用 JDK 7。
在引擎盖下,它们被转换为ForkJoinTask对象。我知道ForkJoinPool在任务递归地分成较小的任务时是有效的。
问题:
如果没有递归,工作窃取在ForkJoinPool中是否仍然有效?
在这种情况下,值得吗?
更新 1:任务很小,可能会不平衡。即使对于严格相等的任务,诸如上下文切换,线程调度,停车,页面丢失等之类的事情也会妨碍导致不平衡。
更新 2:Doug Lea在并发JSR-166兴趣小组中写道,对此进行了提示:
当所有任务都是异步的并提交到池而不是分叉时,这也大大提高了吞吐量,这成为构建执行组件框架以及许多可能使用ThreadPoolExecutor的普通服务的合理方法。
我认为,当涉及到相当小的CPU密集型任务时,ForkJoinPool是要走的路,这要归功于这种优化。重点是这些任务已经很小,不需要递归分解。偷工是有效的,不管是大任务还是小任务——任务可以被另一个自由工人从繁忙工人的Deque尾巴上抓取。
更新3:ForkJoinPool的可扩展性 - Akka乒乓球团队的基准测试显示出很好的效果。
尽管如此,要更有效地应用 ForkJoinPool,还需要进行性能调优。