我正在使用以下代码学习Scala Future:
object DangerousAndSlowService {
def queryNextNumber: Long = {
50
}
}
val number1F = Future { DangerousAndSlowService.queryNextNumber }
number1F.onComplete({
case Success(value) => {
println(s"Got the callback, meaning = $value")
}
case Failure(exception) => {
exception.printStackTrace
}
})
然而," 50"永远不会打印。 已经花了好几个小时但仍然无法理解。
感谢。
答案 0 :(得分:2)
主线程退出而不让未来完成其工作,因此输出是非确定性的:有时它会打印一些东西,有时它不会。如果您不介意阻止主线程,可以使用Await
:
import scala.concurrent.Future
import scala.util.{Success, Failure}
import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.Await
import scala.concurrent.duration._
object DangerousAndSlowService {
def queryNextNumber: Long = {
50
}
}
val number1F = Future { DangerousAndSlowService.queryNextNumber }
number1F.onComplete({
case Success(value) => {
println(s"Got the callback, meaning = $value")
}
case Failure(exception) => {
exception.printStackTrace
}
})
Await.result(number1F, 1.second)
虽然此处需要Await
来生成输出,但还要注意您应谨慎使用它。它会阻塞当前线程,当您使用异步计算和期货时,这通常不是您想要的。