【问题标题】:In Scala, does Futures.awaitAll terminate the thread on timeout?在 Scala 中,Futures.awaitAll 是否会在超时时终止线程?
【发布时间】:2012-07-24 19:32:27
【问题描述】:

所以我在 scala 中编写了一个迷你超时库,它看起来与这里的代码非常相似:How do I get hold of exceptions thrown in a Scala Future?

我执行的函数要么成功完成,要么永远阻塞,所以我需要确保在超时时取消执行线程。

因此我的问题是:在超时时,awaitAll 会终止底层actor,还是让它永远运行?

我正在考虑的一种替代方法是使用 java Future 库来执行此操作,因为可以调用一个显式的 cancel() 方法。

【问题讨论】:

  • “永远阻塞”是什么意思 –那是阻塞I / O吗?也许改用异步 I/O。不推荐硬中断 Java 线程。否则,如果该块仍在“接收”中,为什么不使用在您链接到的问题中给出的 Viktor Klang 的答案中的演员方法?然后你可以向那个演员发送一条流产消息。

标签: scala concurrency jvm akka


【解决方案1】:

[免责声明 - 我自己是 Scala 演员的新手] 当我读到它时,scala.actors.Futures.awaitAll 一直等到期货列表全部解决或直到超时。它不会Future.cancelThread.interrupt 或以其他方式尝试终止Future;你可以稍后再回来等待。

Future.cancel 可能是合适的,但是请注意,您的代码可能需要参与影响cancel 操作 - 它不一定是免费的。 Future.cancel 取消已安排但尚未开始的任务。它会中断一个正在运行的线程[设置一个可以检查的标志]......这可能会或可能不会确认中断。查看Thread.interruptThread.isInterrupted()。您的长时间运行的任务通常会检查它是否被中断(您的代码)并自行终止。各种方法(即Thread.sleepObject.wait 等)通过抛出InterruptedException 来响应中断。您需要审查并理解该机制,以确保您的代码在这些限制内满足您的需求。见this

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2012-04-29
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多