2009-08-07 30 views
6

期货非常便利,但在实践中,您可能需要一些担保执行。例如,考虑:实际使用期货?也就是说,如何杀死他们?

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秒钟后继续运行并稍后返回。超时不会杀死未来;它只是限制连接等待。

那么在超时时间过后,你如何杀死未来?除非你确定他们会在已知的时间内返回,否则期货似乎不能用于实践。否则,您将面临线程池中的线程无法终止期货的风险,直到没有剩余线程为止。

所以问题是:你如何杀死未来?鉴于这些风险,期货的预期使用模式是什么?

回答

2

期货旨在用于您需要等待计算完成的环境中,无论如何。这就是为什么他们被描述为用于缓慢运行函数。你想要那个函数的结果,但你还有其他的东西可以做。事实上,你可能会有许多期货,所有的期货都是独立的,你可能想要平行运行,而你等到全部完成。

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

+1

但由于暂停问题还没有解决:),你不能保证函数将返回。因此,期货可能永远不会回报。所以原来的问题仍然存在...... 关于awaitAll()被用来拉取部分结果的观点。所以这听起来像一个使用模式:传入一个类,在生成时保存部分结果,然后使用计时器将其拉出。 – DrGary 2009-08-07 20:09:17

1

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

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