所以我在scala中编写一个迷你超时库,它看起来与这里的代码非常相似:How do I get hold of exceptions thrown in a Scala Future?
我执行的函数要么成功完成,要么永远阻塞,所以我需要确保在超时时执行的线程被取消。
因此我的问题是:在超时时,awaitAll是否会终止基础角色,或者只是让它永远保持运行?
我正在考虑的一个替代方案是使用java Future库来执行此操作,因为有一个可以调用的显式cancel()方法。
答案 0 :(得分:0)
[免责声明 - 我自己是Scala演员的新手]
当我读到它时,scala.actors.Futures.awaitAll
一直等到期货清单全部解决或等到超时。它不会Future.cancel
,Thread.interrupt
或以其他方式尝试终止Future
;你可以稍后回来再等一会儿。
Future.cancel
可能是合适的,但请注意,您的代码可能需要参与实施cancel
操作 - 它不一定是免费的。 Future.cancel
取消已安排但尚未启动的任务。它会中断正在运行的线程[设置一个可以检查的标志] ......它可能会也可能不会确认中断。查看Thread.interrupt
和Thread.isInterrupted()
。您长时间运行的任务通常会检查它是否被中断(您的代码),并自行终止。各种方法(即Thread.sleep
,Object.wait
和其他方法)通过抛出InterruptedException
来响应中断。你需要回顾一下&了解这种机制,以确保您的代码在这些约束条件下满足您的需求。请参阅this。