kotlin 协程作用域中嵌套两个子协程和一个普通的函数,为什么普通函数会先执行
时间: 2023-03-19 08:24:54 浏览: 137
在 Kotlin 协程中,协程是可以嵌套的,而在协程作用域中启动的协程都会遵循作用域的规则。具体来说,当协程作用域被取消时,作用域中启动的所有协程都会被取消。当启动一个新的协程时,它会成为父协程的子协程,如果父协程被取消,那么所有的子协程也会被取消。
在协程作用域中嵌套两个子协程和一个普通函数时,如果普通函数没有被包装在一个协程中启动,那么它将不受协程作用域的影响,它将在当前线程中执行,并且会先于子协程执行。这是因为协程是一种轻量级的线程,它们可以在同一个线程中并发执行,但是它们需要协作才能正确地交替执行。而普通函数不是协程,它不会自动地参与到协程的协作中去。
如果你想让普通函数和子协程同时执行,你可以将普通函数包装成一个协程并在协程作用域中启动它。这样,它就会成为父协程的子协程,遵循协程作用域的规则,同时也能与其他子协程正确地协作执行。例如,可以使用 `launch` 函数启动一个新的协程来包装普通函数:
```kotlin
val scope = CoroutineScope(Dispatchers.Default)
scope.launch {
// 第一个子协程
launch {
println("子协程 1 开始执行")
delay(1000)
println("子协程 1 执行结束")
}
// 第二个子协程
launch {
println("子协程 2 开始执行")
delay(500)
println("子协程 2 执行结束")
}
// 普通函数包装成的协程
launch {
println("普通函数开始执行")
delay(750)
println("普通函数执行结束")
}
}
```
在这个示例中,我们使用 `CoroutineScope` 创建了一个协程作用域,并使用 `launch` 函数分别启动了三个子协程。其中,第一个子协程会执行 1 秒钟,第二个子协程会执行 0.5 秒钟,而第三个子协程是一个包装了普通函数的协程,它会执行 0.75 秒钟。由于这三个子协程都是在同一个协程作用域中启动的,它们将会遵循协程作用域的规则,正确地交替执行。
阅读全文