在Scala中,Futures.awaitAll会在超时时终止线程吗?

时间:2012-07-24 19:32:28

标签: scala concurrency jvm akka

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

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

因此我的问题是:在超时时,awaitAll是否会终止基础角色,或者只是让它永远保持运行?

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

1 个答案:

答案 0 :(得分:0)

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

Future.cancel可能是合适的,但请注意,您的代码可能需要参与实施cancel操作 - 它不一定是免费的。 Future.cancel取消已安排但尚未启动的任务。它会中断正在运行的线程[设置一个可以检查的标志] ......它可能会也可能不会确认中断。查看Thread.interruptThread.isInterrupted()。您长时间运行的任务通常会检查它是否被中断(您的代码),并自行终止。各种方法(即Thread.sleepObject.wait和其他方法)通过抛出InterruptedException来响应中断。你需要回顾一下&了解这种机制,以确保您的代码在这些约束条件下满足您的需求。请参阅this