为什么onComplete在Scala中的代码中等待Promise.success?

Fed*_*ico 3 scala

我正在阅读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吗?

cmb*_*ter 6

我的猜测是,这与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)