在ForkJoinPool上替换setMaximumPoolSize

时间:2013-03-11 17:58:01

标签: scala fork-join parallel-collections

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

有没有办法以某种方式限制池中的线程数?我真的不关心生成时阻塞的IO行为,但我想要一定程度的并行性,因为我的IO任务是独立的,不会互相干扰。

1 个答案:

答案 0 :(得分:1)

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

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