[英]Practical use of futures? Ie, how to kill them?
期货非常方便,但在实践中,您可能需要对其执行提供一些保证。 例如,考虑:
import scala.actors.Futures._
def slowFn(time:Int) = {
Thread.sleep(time * 1000)
println("%d second fn done".format(time))
}
val fs = List( future(slowFn(2)), future(slowFn(10)) )
awaitAll(5000, fs:_*)
println("5 second expiration. Continuing.")
Thread.sleep(12000) // ie more calculations
println("done with everything")
我们的想法是并行启动一些慢速运行的功能。 但是如果期货执行的函数没有返回,我们就不想永远挂起。 所以我们使用awaitAll()来对期货进行超时。 但是如果您运行代码,您会看到5秒计时器到期,但10秒未来继续运行并稍后返回。 超时不会杀死未来; 它只是限制了连接等待。
那么你如何在超时后杀死未来? 似乎期货不能在实践中使用,除非您确定它们将在已知的时间内返回。 否则,您将冒险将线程池中的线程丢失到非终止期货,直到没有剩余。
所以问题是:你如何杀死未来? 鉴于这些风险,期货的预期使用模式是什么?
期货旨在用于您需要等待计算完成的设置,无论如何。 这就是他们被描述为用于慢速运行功能的原因 。 你想要这个功能的结果,但你可以同时做其他的事情。 事实上,你可能有许多期货,你们可能想要并行运行,而你们要等到所有期货都完成。
计时器只是等待获得部分结果。
我认为Future不能简单地被“杀死”的原因与java.lang.Thread.stop()被弃用的原因完全相同。
在Future运行时,需要一个Thread。 为了在不执行Thread的情况下调用stop()来停止Future,需要特定于应用程序的逻辑:定期检查应用程序特定标志或执行线程的中断状态是一种方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.