我注意到,自Scala 2.9。*以来,setMaximumPoolSize
方法似乎已从ForkJoinPool
消失,看起来它就像我想要的那样。在Scala的并行集合中限制并行性的大多数讨论都集中在同一个类上的setParallelism
方法(它也已消失,但对我来说不是一个问题)但在我的情况下,并行任务可以执行外部IO并且经常会阻止它。在这种情况下,ForkJoinPool
会激活更多线程,并有效地对相关的共享IO资源执行DOS,这是不可取的。
有没有办法以某种方式限制池中的线程数?我真的不关心生成时阻塞的IO行为,但我想要一定程度的并行性,因为我的IO任务是独立的,不会互相干扰。
答案 0 :(得分:1)
您引用的行为称为“延续线程”。由于join()方法不执行上下文切换,因此框架将在没有这些额外线程的情况下停止。有报道称这些额外的线程产生了数百/数千个。
Java8用“延续线程”取代了这种糟糕的做法。也就是说,线程继续从双端队列中获取任务,但是它可能导致停顿或堆栈溢出。没有替代使用ForkJoinPool.managedBlock()的代码,这可能是您在I / O处的位置。