我正在使用jdk 7的新forkjoin框架。 我有一个任务,必须使用不同的参数多次执行。
此任务扩展RecursiveTask
。要执行的任务超过100个,可以同时执行。任务是独立的,因此不需要任何同步。
因此,我首先创建了所需的任务并将它们传递给forkjoin线程池。
但是应用程序变得比没有任何并行性的运行速度慢。
我的第一个想法是,我创建了很多线程。这就是为什么我试图回收线程以减少对象创建开销,但这对性能没有影响。使用reinitialize()方法回收im。此外,通过回收,性能比没有任何并行性的运行速度慢。
在任务中执行的操作并不简单,运行线程的持续时间为5到150毫秒。该应用程序在双核机器上运行,即时使用ubuntu和oracle jdk 7。
答案 0 :(得分:0)
CoopSoft的Edward Harned发现了用Java实现的Fork / Join设计的许多问题。
特别是"偷工作"遭受高度争用在围绕多个处理器传播工作方面效率很低。递归分解也不是特别有效。
如果您的任务不递归 - 您说有100个,并且它们可以同时执行 - 那么使用ThreadPoolExecutor的更简单的方法可能会更有效。
请参阅: