Scala Fork Join Pool,如何实现没有并发结构的多个任务

时间:2015-03-12 04:19:36

标签: scala fork-join

好的,所以我对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的正确方向。

1 个答案:

答案 0 :(得分:1)

一般来说,我不愿意完全遵循这条道路。 Scala有一个非常干净的范例,以便运行平行计算,感觉更加惯用。

如果您不熟悉Scala中的异步计算,我建议您启动reading this

特别是,您可以定义和/或重用几种ExecutorContext,以获得所需的线程池类型。或者,如果您没有阻止线程(默认情况下每个核心只有一个),您可以使用默认线程