【问题标题】:Is Await.ready really blocking main thread?Await.ready 真的阻塞了主线程吗?
【发布时间】:2019-07-01 06:19:58
【问题描述】:

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

【问题讨论】:

    标签: scala future


    【解决方案1】:
    val k = b.flatMap(x => {a.map(y => x+y)})  
    println("k = " + k)
    

    k 是一个将在后台计算的 Future。结果将不会在下一行中提供。

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

    所以你也需要Await.result(k)

    【讨论】:

    • 谢谢,我在想k未完成的原因与a有关。
    猜你喜欢
    • 1970-01-01
    • 2017-12-24
    • 2019-09-01
    • 1970-01-01
    • 2020-01-02
    • 2022-10-05
    • 2018-02-16
    • 1970-01-01
    • 2015-12-29
    相关资源
    最近更新 更多