我正在try 理解Kotlin中的 struct 化并发,但我无法理解这段代码.
fun main(): Unit = runBlocking {
other(this)
}
suspend fun other(scope: CoroutineScope) {
val job = scope.launch {
scope.launch {
delay(200)
println("e")
}
println("a")
}
job.invokeOnCompletion {
println("Complete")
}
}
代码打印出来
a
Complete
e
而如果我将内部的scope.launch
呼叫替换为launch
,如下所示
suspend fun other(scope: CoroutineScope) {
val job = scope.launch {
launch {
delay(200)
println("e")
}
println("a")
}
job.invokeOnCompletion {
println("Complete")
}
}
它是打印的
a
e
Complete
这表明第一个示例不遵循 struct 化并发,因为父作业(job)先于子作业(job)完成.我的困惑是,为什么会发生这种情况?
我觉得在这种情况下,scope.launch
可能相当于呼叫launch
(应该相当于this.launch
,这指的是scope
).但这似乎不是真的.有人能解释一下为什么第一次调用会导致非 struct 化并发吗?两次启动调用之间有什么不同?谢谢!