我在Scala中有一段代码,在其中我在主块中使用Await.ready
,然后使用相应的值。
import scala.concurrent.{Future, Await}
import scala.concurrent.duration.Duration
import scala.concurrent.ExecutionContext.Implicits.global
import concurrent.Promise
val a = Future[Int] {
Thread.sleep(100)
4+6
}
val b = Future[Int] {
12
}
val r1= Await.ready(a,Duration.Inf)
val r2=Await.ready(b,Duration.Inf)
println("a = " + a)
println("b = " + b)
val k = b.flatMap(x => {a.map(y => x+y)})
println("k = " + k)
这导致
a = Future(Success(10))
b = Future(Success(12))
k = Future(<not completed>)
为什么不计算k
?
答案 0 :(得分:4)
val k = b.flatMap(x => {a.map(y => x+y)})
println("k = " + k)
k
是将在后台计算的Future。结果将不会在下一行显示。
在您的情况下,您已经等待b
和a
完成,因此k
的计算实际上不会花费任何时间,但是某些后台执行程序仍然需要评估flatMap
。
因此,您还需要Await.result(k)
。