0

有什么方法可以中断 Scala 中的并行集合计算?

例子:

val r = new Runnable {
  override def run(): Unit = {
    (1 to 3).par.foreach { _ => Thread.sleep(5000000) }
  }
}
val t = new Thread(r)
t.start()
Thread.sleep(300) // let them spin up
t.interrupt()

我希望t.interrupt中断由 产生的所有线程par,但这没有发生,它一直在内部旋转ForkJoinTask.externalAwaitDone。看起来该方法清除了中断状态并继续等待生成的线程完成。

这是 Scala 2.12

4

1 回答 1

2

t.start()只负责启动并行计算并等待和收集结果的线程。

它不连接到计算操作的线程。通常,它默认运行forkJoinPool,独立于提交计算任务的线程。

如果要中断计算,可以使用自定义执行后端(如手动创建forkJoinPool或 a threadPool),然后将其关闭。你可以在这里阅读。

或者您可以从计算中提供回调。

但是所有这些方法对于这种情况都不是那么好。

如果您制作的是生产解决方案,或者您的案例对应用程序来说很复杂且至关重要,您可能应该使用设计取消的东西。喜欢Monix.TaskCancellableFuture

或者至少使用解决方法Future并取消它。

于 2020-08-06T23:30:30.723 回答