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