2

我正在使用jdk 7的新forkjoin框架。我有一个任务,必须使用不同的参数执行多次。

此任务扩展RecursiveTask。有100多个任务要执行,可以同时执行。这些任务是独立的,因此不需要任何同步。因此,我首先创建了所需的任务并将它们传递给 forkjoin 线程池。但是应用程序变得比在没有任何并行性的情况下运行它要慢。

我的第一个想法是,我创建了很多线程。这就是为什么我试图回收线程以减少对象创建开销,但这对性能没有影响。使用 reinitialize() 方法回收 im。此外,通过回收,性能比在没有任何并行性的情况下运行它要慢。

任务中执行的操作并非微不足道,运行线程的持续时间从 5 到 150 毫秒。该应用程序在双核机器上运行,我使用 ubuntu 和 oracle jdk 7。

4

1 回答 1

0

CoopSoft 的 Edward Harned 发现用 Java 实现的 Fork/Join 设计存在许多问题。

特别是,“工作窃取”存在高度争用,并且在将工作分散到多个处理器时效率低下。递归分解也不是特别有效。

如果你的任务不是递归的——你说有 100 个,它们可以同时执行——那么使用 ThreadPoolExecutor 的更简单的方法可能更有效。

看:

于 2014-06-12T11:14:01.857 回答