所以,我在stackoverflow上看到一些关于以某种方式询问如何“杀死”未来的问题,而不是弃用的Thread.stop().我看到答案解释了为什么不可能,但没有解决类似问题的替代机制.
例如:Practical use of futures? Ie, how to kill them?
我意识到未来不可能“被杀”.
我知道如何用Java方式做到这一点:将任务分解为更小的睡眠,并在一个定期检查的线程类中有一些“volatile boolean isStillRunning”.如果我通过更新此值取消了该线程,则该线程退出.这涉及“共享状态”(isStillRunning var),如果我在Scala中做同样的事情,它似乎不会非常“有用”.
在惯用功能标量中解决此类问题的正确方法是什么?有一个相当简洁的方法吗?我应该恢复“正常”线程和易失性标志吗?我应该以与Java关键字相同的方式使用@volatile?
最佳答案 是的,它看起来和Java一样.
对于测试装备,测试可能会挂起或运行时间太长,我会使用承诺未通过测试(出于任何原因).例如,超时监视器可以“取消”测试运行器(中断线程并比较并设置一个标志),然后完成失败的承诺.或者测试准备可能会导致配置错误的测试失败.或者,测试运行并产生结果.在更高的层次上,测试台只看到未来及其价值.
与Java不同的是你构成期货的选择.
val all = Future.traverse(tests)(test => {
val toKeep = promise[Result] // promise to keep, or fail by monitor
val f = for (w <- feed(prepare(test, toKeep))) yield {
monitored(w, toKeep) {
listener.start(w)
w.runTest()
}
}
f completing consume _
// strip context
val g = f map (r => r.copy(context = null))
(toKeep completeWith g).future
})