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

Is Await.ready really blocking main thread?

我在 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 没有计算出来?

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

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

在你的例子中,你已经等待 ba 完成,所以 k 的计算实际上不会花费任何时间,但一些后台执行程序会还需要评估 flatMap.

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