好的,所以我对Scala非常陌生(昨天开始)。我一直在阅读有关并发的文档,但未能找到如何在fork Join Pool中使用Callables运行更大的任务。这就是我在Scala中使用Java时所用的草图。
private Object fjp{
val fjp:ForkJoinPool=new ForkJoinPool(Runtime.getRuntime.availableProcessors()*2)
var w:Int=0
def invokeObjects(collection:Collection[Callable[Map[String:Int]]]){
var futures=fjp.invokeAll(collection)
w=0
while(fjp.isQuiescent()==false && fjp.getActiveThreadCount()==0){
w=w+1
}
println("Checked "+w+" times")
for(i<-0 to futures.size()){
var mp=futures.get(i).get()
//add keys to a common list
//submit count with frequency to sparse matrix
//avoid a ton of locking
}
}
}
我如何将代码转换为可以不断调用的forkjoin池。如果可能的话,我可以使用没有其他列表的foreach来获得结果吗?感谢您的帮助。它也将指向我与Scala的正确方向。
答案 0 :(得分:1)
一般来说,我不愿意完全遵循这条道路。 Scala有一个非常干净的范例,以便运行平行计算,感觉更加惯用。
如果您不熟悉Scala中的异步计算,我建议您启动reading this。
特别是,您可以定义和/或重用几种ExecutorContext,以获得所需的线程池类型。或者,如果您没有阻止线程(默认情况下每个核心只有一个),您可以使用默认线程