是否有可能以及如何让Scala使用线程池中的线程?

问题描述:

在斯卡拉2.11.8我使用par来并行化一个大而长的foreach。我还试图优化代码以避免每次都创建对象的新实例,因此我需要使用DynamicVariable。但是,我注意到仍然有很多这个类创建的实例,这导致我认为par总是跨越新线程而不是重用它们。因此,OP如何使par从线程池中消耗有限的可重用线程?这可能吗?是否有可能以及如何让Scala使用线程池中的线程?

for (k <- 0 until 5) { 
    // avoid creating instances of PearsonsIncCorr 
    val inc = new DynamicVariable[PearsonsIncCorr](new PearsonsIncCorr) 
    elems.par foreach { pair => // <======= Here I'd like par to consume from a Thread pool 
     inc.withValue(new PearsonsIncCorr) { 
     inc.reset(...) 
     // compute incremental correlation 
     } 
    } 
} 

par具有默认线程池,这就是scala.concurrent.ExecutionContext.global,该线程池由processors依赖。

所以par不会永远产卵新的线程。

,如果你需要创建自定义TaskSupport,你可以不喜欢它:

val pc = mutable.ParArray(1, 2, 3) 
    pc.tasksupport = new ForkJoinTaskSupport(
     new java.util.concurrent.ForkJoinPool(2)) 
    }}} 
    pc.foreach(println)