Await.ready真的阻塞了主线程吗?

时间:2019-02-07 07:19:08

标签: scala future

我在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

1 个答案:

答案 0 :(得分:4)

val k = b.flatMap(x => {a.map(y => x+y)})  
println("k = " + k)

k是将在后台计算的Future。结果将不会在下一行显示。

在您的情况下,您已经等待ba完成,因此k的计算实际上不会花费任何时间,但是某些后台执行程序仍然需要评估flatMap

因此,您还需要Await.result(k)