Scala期货和多线程

时间:2017-06-15 15:48:16

标签: multithreading scala future

我是Scala的新手,我正在尝试处理期货和多线程

我有一个程序的SingleThreaded版本,可以对矩阵进行一些计算

SingleThreadCalc {
  def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = Future{doMath(matrix)}
}

我现在想要的是制作它的多线程版本。 它是否应该只传递一个具有多个线程的ExecutionContext?

MultiThreadCalc {
  def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = 
Future{doMath(matrix)} (ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)))

这会共享所有线程之间的计算负载还是根本没有发生呢?

1 个答案:

答案 0 :(得分:1)

简短回答:不。

答案很长:

object MultiThreadCalc {
 def run(matrix : Seq[Seq[Double]]) : Future[Seq[Seq[Double]] = 
    Future{doMath(matrix)}(ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10)))
}

对于run的每次调用,上面的代码将分配一个永远不会关闭的新线程池,它将用于执行单个方法doMath(所以只有1个将使用该池中的线程。)

现在,如果你想并行化doMath本身的执行,那么你需要将ts定义修改为可并行化,可能需要使用implicit ec: ExecutionContext参数并在其中使用它的定义。

但是如果您想要并行运行doMath的多个调用,那么您可以执行以下操作:

object MultiThreadCalc {
  def run(matrix : Seq[Seq[Double]])(implicit ec: ExecutionContext) : Future[Seq[Seq[Double]] = Future{doMath(matrix)}
}

然后在"外部"上创建一个可能ExecutionContext.fromExecutor(Executors.newFixedThreadPool(10))的ExecutionContext。并且只要你想在它上面执行逻辑就使用它。