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())
}
输出:
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())
}
输出:
只有协程构建器和作用域存在差异,但我得到了意外的输出? 谁能告诉我为什么会这样?
使用
runBlocking
测试协程的异步行为可能会让您感到困惑,因为它使用单线程调度程序,最终由零参数继承 launch
。
第一个样本的结果是“随机”的(只需运行几次,有时它返回 null 而不是 3)。成功取决于以下事实:
println
是某种繁重的操作,它为新协程启动并发出值提供了足够的时间。
同时第二个是确定性的(没有多线程竞争)。它运行你的块直到它到达一个暂停点 - 但没有一个所以它只是继续运行直到你的
runBlocking
的根完成,然后调度程序才开始执行 launch
-ed 子协程。