在Scala中如何让线程等待未来的结果准备就绪?

时间:2015-05-04 22:06:39

标签: scala functional-programming future

我有一个回调处理程序,它处理URL处理的许多阶段之一。在这个处理程序中,我必须使用第三方库(scala接口)并计算一些值,这将设置一个全局配置。此配置由以下阶段使用,它在回调处理程序中获得的值起着至关重要的作用。

以下是设计的外观

def callbackHandler() : someReturnType = {
    val myFut = getMyData() // return a future
    myFut map {m => set_global} // evaluate the future
    someReturnTypeObject
}

有了这个背景,这是我的问题。我正在使用的Scala API向我返回一个未来,我使用" map"来评估它。正如我在获得未来实例后所理解的那样,回调函数将继续使用待处理的东西,并且将在可用时评估将来(在单独的线程中)。

在这种情况下,我将如何确保让回调处理程序等待将来的评估?

将第4行移动到地图主体可能无法正常工作,因为如果地图占用时间,callbackhandler可能仍会提前返回。如果您有疑问,请告诉我,或者如果我的理解错误,请告诉我。

1 个答案:

答案 0 :(得分:1)

使用Future的目的是不阻止线程。理想情况下,您应该在未来完成时执行您想要的代码,而不是阻止未来并在同一个线程上继续。

也就是说,阻止未来的机制是:

val result = Await.result(myFut, 10.seconds)

其中10.seconds是您愿意等待的最长时间。

您还应注意map评估未来。一旦拨打getMyData,评估就会开始。一旦结果可用,map所做的就是将未来的结果转化为未来。