首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >期货的实际用途?也就是说,怎么杀了他们?

期货的实际用途?也就是说,怎么杀了他们?
EN

Stack Overflow用户
提问于 2009-08-07 17:14:52
回答 2查看 1.9K关注 0票数 6

期货非常方便,但在实践中,您可能需要对它们的执行进行一些保证。例如,考虑以下内容:

代码语言:javascript
运行
复制
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秒的未来继续运行,并在稍后返回。超时并不会扼杀未来;它只是限制了加入等待。

那么,如何在超时后杀死一个未来呢?似乎期货不能在实践中使用,除非你确定它们会在已知的时间内返回。否则,您将冒着将线程池中的线程丢失到非终止未来的风险,直到线程池中没有线程为止。

因此,问题是:如何扼杀期货?考虑到这些风险,期货的预期使用模式是什么?

EN

回答 2

Stack Overflow用户

发布于 2009-08-07 17:23:39

无论发生什么情况,都要在需要等待计算完成的设置中使用期货。这就是为什么它们被描述为用于运行速度较慢的函数。你想要那个函数的结果,但同时你还有其他事情可以做。事实上,您可能有许多相互独立的未来,您可能希望并行运行,同时等待所有的未来完成。

计时器只是提供等待以获取部分结果。

票数 2
EN

Stack Overflow用户

发布于 2009-08-08 05:20:47

我认为Future不能简单地“杀死”的原因与java.lang.Thread.stop()为deprecated的原因完全相同。

当Future运行时,需要一个线程。为了在不对执行线程调用stop()的情况下停止Future,需要特定于应用程序的逻辑:定期检查特定于应用程序的标志或执行线程的中断状态是一种方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1245937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档