0

我注意到自从 Scala 2.9.* 以来,该setMaximumPoolSize方法似乎已经消失了ForkJoinPool,它看起来就像我想要的那样。大多数关于限制 Scala 并行集合中的并行性的讨论都围绕setParallelism同一个类的方法(它也已经消失,但对我来说不是什么大问题),但在我的情况下,并行任务可以执行外部 IO,并且经常会阻塞在上面。然后ForkJoinPool在这种情况下启动更多线程并有效地针对有问题的共享 IO 资源执行 DOS,这是不可取的。

有没有办法以某种方式限制池中的线程数?我并不真正关心 spawn-when-blocked-on-IO 行为,但我想要某种程度的并行性,因为我的 IO 任务是独立的并且不会相互干扰。

4

1 回答 1

1

您所指的行为称为“延续线程”。由于 join() 方法不进行上下文切换,因此框架将在没有这些额外线程的情况下停止。有报告称这些额外线程产生了成百上千。

Java8 用“延续线程”取代了这种糟糕的做法。也就是说,线程继续从双端队列中获取任务,但它可能导致停顿或堆栈溢出。使用 ForkJoinPool.managedBlock() 的代码没有替代品,这可能是您使用 I/O 所在的位置。

于 2013-03-12T13:42:53.757 回答