【问题标题】:How to interrupt asynchronous computations in Scala?如何中断Scala中的异步计算?
【发布时间】:2013-03-11 10:57:08
【问题描述】:

我需要运行两个并行计算并在第二个完成时中断第一个。目前,我已经使用标准 Java 线程实现了它:

/**
 * Runs <var>sup</var> in parallel with <var>main</var>.
 * Terminate (interrupt) it when <var>main</var> finishes.
 */
def support[R](sup: => Unit, main: => R): R = {
  val supThread = new Thread {
    override def run = { sup };
  }

  supThread.start();
  try {
    main;
  } finally {
    supThread.interrupt();
  }
}

在不显式使用Threads 的情况下,是否可以使用Scala 的并发库来实现相同的行为?

【问题讨论】:

  • 您使用 Java API 的实现并不可靠 - 中断并不总是按预期工作,可能永远不应该使用。最好为提前终止明确编码 - 例如如上面评论中链接的答案。共享 AtomicBoolean 是(许多)可能的解决方案之一。

标签: scala concurrency interrupt-handling


【解决方案1】:

不适用于 Scala 标准期货 (AFAIK),但 Twitter's Util library 确实支持它:

val future = Future { sup }
future.cancel() // in 5.x
future.raise(new FutureCancelledException) // in 6.x

【讨论】:

  • 现在 Scala 标准库中是否有与此等效的功能,2 年了?
  • 不是直接的,而是看stackoverflow.com/a/16010193/9204,尤其是cmets中的讨论。
  • 你可以在 Scala 中使用 Promises 来实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2012-05-14
  • 1970-01-01
相关资源
最近更新 更多