Java 偷工平行作业不';我似乎偷不了多少活

Java 偷工平行作业不';我似乎偷不了多少活,java,scala,parallel-processing,work-stealing,Java,Scala,Parallel Processing,Work Stealing,其思想是在96核机器上运行并行作业,并使用工作窃取ForkJoinPool 以下是我目前使用的代码: import scala.collection.parallel.ForkJoinTaskSupport import scala.concurrent.forkjoin.ForkJoinPool val sequence: ParSeq[Item] = getItems().par sequence.tasksupport = new ForkJoinTaskSupport(new Fork

其思想是在96核机器上运行并行作业,并使用工作窃取
ForkJoinPool

以下是我目前使用的代码:

import scala.collection.parallel.ForkJoinTaskSupport
import scala.concurrent.forkjoin.ForkJoinPool

val sequence: ParSeq[Item] = getItems().par
sequence.tasksupport = new ForkJoinTaskSupport(new ForkJoinPool())
val results = for {
  item <- sequence
  res   = doSomethingWith(item)
} yield res
导入scala.collection.parallel.ForkJoinTaskSupport
导入scala.concurrent.forkjoin.ForkJoinPool
VALL序列:PARSEQ [项]=GeTimes()
sequence.tasksupport=新的ForkJoinTaskSupport(新的ForkJoinPool())
val结果=用于{

item每个工作线程都有其内部任务队列,该队列受到保护,防止从其他线程窃取工作,以限制工作线程之间的交互


这可能解释了您所看到的行为,特别是在项目集中出现的长任务不是随机的情况下。

这与文档不矛盾吗?ForkJoinPool与其他类型的ExecutorService的区别主要在于采用了工作窃取:池中的所有线程都试图查找并执行提交给的任务池和/或由其他活动任务创建在您编写时,可窃取的任务是一个:仍然在公共池中,或由其他活动任务显式创建。因此,我假设“doSomethingWithItem()”实际上并不创建子任务(但您告诉我!),在这一点上,这些条件都不满足,所以没有任务是可窃取的。深入挖掘一下,我发现这篇文章:作为对forkjoinpool中发生的事情的一个体面的解释(至少比我可以写的要好:D)另外,有一个方法getStealCount()用于您的池,您可以使用它来监视实际发生的窃取(我猜没有:D)