MST

星途 面试题库

面试题:Kotlin协程结构化并发之父子协程关系

在Kotlin协程中,阐述一下父协程和子协程之间的生命周期关系是怎样的?如果父协程异常取消,子协程会如何?请举例说明如何创建父子协程以及处理它们之间的这种关系。
14.4万 热度难度
编程语言Kotlin

知识考点

AI 面试

面试题答案

一键面试
  1. 生命周期关系
    • 在Kotlin协程中,子协程的生命周期依附于父协程。当父协程启动后,子协程可以在父协程的作用域内启动。父协程结束时(正常完成或异常取消),子协程也会相应地结束。
  2. 父协程异常取消时子协程的情况
    • 如果父协程异常取消,子协程也会立即取消。这是因为子协程的生命周期依赖于父协程,父协程出现异常取消,会将取消信号传递给所有子协程。
  3. 创建父子协程及处理关系示例
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块捕获父协程抛出的异常。