我正在阅读Scala中的Futures和Promises,并编写了以下代码:
def printSomething(): Future[String] = {
val p = Promise[String]
val sayHello = future {
Thread.sleep(1000)
p.success("hello")
}
p.future
}
def main(args: Array[String]) {
val something: Future[String] = printSomething()
something onComplete {
case Success(p) => println(p)
}
}
问题是onComplete
回调没有print
任何东西(除非我调试它)。
onComplete
是否必须等待p.success("hello")
中的printSomething
?
答案 0 :(得分:6)
我的猜测是,这与您ExecutionContext
的{{1}}有关,因此当main
超过onComplete
时就会终止。如果你在onComplete
之后添加一个睡眠,你应该得到你想要的。稍微修改过的代码版本显示:
import concurrent._
import ExecutionContext.Implicits._
object PromTest {
def printSomething(): Future[String] = {
val p = Promise[String]
val sayHello = future {
Thread.sleep(1000)
p.success("hello")
}
p.future
}
def main(args: Array[String]) {
val something: Future[String] = printSomething()
something onComplete {
case result => println(result)
}
Thread.sleep(2000)
}
}
答案 1 :(得分:2)
正如其他人所说,你的执行会在你的未来有机会运行之前终止。但是,我觉得添加硬编码的睡眠调用并不是最干净的解决方案,等待未来完成(超时,以防止代码卡住)是可取的:
Await.ready(something, Duration(2000, MILLISECONDS))
这将使something
完成等待最多2000毫秒,否则将失败。
答案 2 :(得分:1)
您的应用在您的承诺完成之前退出。在主要方法的最后,只需添加Thread.sleep(2000)
之类的内容,您就会看到结果。