Tag: work stealing

Java ForkJoinPool具有非递归任务,是否可以正常工作?

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