我注意到从Scala 2.9开始。*, setMaximumPoolSize
方法似乎从ForkJoinPool
中消失了,它看起来像我想要的。大多数关于限制Scala并行集合并行性的讨论都集中在同一个类上的setParallelism
方法上(这个方法也消失了,但对我来说不是什么问题),但在我的情况下,并行任务可以执行外部IO,并且经常会阻塞它。在这种情况下,ForkJoinPool
然后启动更多的线程,并有效地对有问题的共享IO资源执行DOS操作,这是不可取的。
是否有办法以某种方式限制池中的线程数?我真的不关心spawn-when-blocked-on-IO行为,但我想要某种程度的并行性,因为我的IO任务是独立的,不相互干扰。
您所指的行为称为"延续线程"。由于join()方法不进行上下文切换,如果没有这些额外的线程,框架将会停止运行。已经有报告说产生了成百上千个这样的额外线程。
Java8用"延续线程"取代了这种糟糕的做法。也就是说,线程继续从队列中获取任务,但这可能导致停顿或堆栈溢出。没有替代使用ForkJoinPool.managedBlock()的代码,这可能是您所处的I/o