面试题答案
一键面试- 生命周期关系:
- 在Kotlin协程中,子协程的生命周期依附于父协程。当父协程启动后,子协程可以在父协程的作用域内启动。父协程结束时(正常完成或异常取消),子协程也会相应地结束。
- 父协程异常取消时子协程的情况:
- 如果父协程异常取消,子协程也会立即取消。这是因为子协程的生命周期依赖于父协程,父协程出现异常取消,会将取消信号传递给所有子协程。
- 创建父子协程及处理关系示例:
import kotlinx.coroutines.*
fun main() = runBlocking {
val parentJob = launch {
// 父协程
val childJob = launch {
// 子协程
try {
delay(1000)
println("Child coroutine is done")
} catch (e: CancellationException) {
println("Child coroutine was cancelled: ${e.message}")
}
}
// 模拟父协程异常
throw RuntimeException("Parent coroutine has an exception")
childJob.join()
}
try {
parentJob.join()
} catch (e: RuntimeException) {
println("Caught exception in main: ${e.message}")
}
}
在上述示例中,父协程launch
块中启动了一个子协程childJob
。父协程抛出RuntimeException
异常从而异常取消,此时子协程也会立即取消,并捕获到CancellationException
。在main
函数中,通过try - catch
块捕获父协程抛出的异常。