我正在阅读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)
}
}
Run Code Online (Sandbox Code Playgroud)
问题是onComplete回调没有print任何东西(除非我调试它).
难道onComplete不必等待p.success("hello")中printSomething吗?
我的猜测是,这与ExecutionContext你正在使用守护程序线程有关,因此当你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)
}
}
Run Code Online (Sandbox Code Playgroud)