无法理解 Kotlin 协程和流程中异步编程的这种行为

问题描述 投票:0回答:1
 runBlocking{
        val x  = MutableStateFlow<Int?>(null)
        CoroutineScope(Dispatchers.Default).launch{
            println("starting of this scope")
            x.emit(3)
            println("ending of this scope")
        }
        println("parent scope")
        println(x.first())
   }

输出:

  • 父范围
  • 此范围的开始
  • 此范围结束
  • 3
runBlocking{
val x  = MutableStateFlow<Int?>(null)
launch{
println("starting of this scope")
x.emit(3)
println("ending of this scope")
}
println("parent scope")
println(x.first())
}

输出:

  • 父范围
  • 此范围的开始
  • 此范围结束

只有协程构建器和作用域存在差异,但我得到了意外的输出? 谁能告诉我为什么会这样?

android kotlin asynchronous kotlin-coroutines
1个回答
0
投票

使用

runBlocking
测试协程的异步行为可能会让您感到困惑,因为它使用单线程调度程序,最终由零参数继承
launch

第一个样本的结果是“随机”的(只需运行几次,有时它返回 null 而不是 3)。成功取决于以下事实:

println
是某种繁重的操作,它为新协程启动并发出值提供了足够的时间。

同时第二个是确定性的(没有多线程竞争)。它运行你的块直到它到达一个暂停点 - 但没有一个所以它只是继续运行直到你的

runBlocking
的根完成,然后调度程序才开始执行
launch
-ed 子协程。

© www.soinside.com 2019 - 2024. All rights reserved.