我是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)))
这会共享所有线程之间的计算负载还是根本没有发生呢?
答案 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。并且只要你想在它上面执行逻辑就使用它。