期货非常方便,但在实践中,您可能需要对它们的执行进行一些保证。例如,考虑以下内容:
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秒的未来继续运行,并在稍后返回。超时并不会扼杀未来;它只是限制了加入等待。
那么,如何在超时后杀死一个未来呢?似乎期货不能在实践中使用,除非你确定它们会在已知的时间内返回。否则,您将冒着将线程池中的线程丢失到非终止未来的风险,直到线程池中没有线程为止。
因此,问题是:如何扼杀期货?考虑到这些风险,期货的预期使用模式是什么?
发布于 2009-08-07 17:23:39
无论发生什么情况,都要在需要等待计算完成的设置中使用期货。这就是为什么它们被描述为用于运行速度较慢的函数。你想要那个函数的结果,但同时你还有其他事情可以做。事实上,您可能有许多相互独立的未来,您可能希望并行运行,同时等待所有的未来完成。
计时器只是提供等待以获取部分结果。
发布于 2009-08-08 05:20:47
我认为Future不能简单地“杀死”的原因与java.lang.Thread.stop()为deprecated的原因完全相同。
当Future运行时,需要一个线程。为了在不对执行线程调用stop()的情况下停止Future,需要特定于应用程序的逻辑:定期检查特定于应用程序的标志或执行线程的中断状态是一种方法。
https://stackoverflow.com/questions/1245937
复制相似问题