Kotlin 面试题
目录

Kotlin 中 coroutineScope 和 supervisorScope 的区别是什么?

· 约 3 分钟读完 · 第 139 / 200 章

推荐答案

在 Kotlin 协程中,coroutineScope 和 supervisorScope 都是用于创建子协程的作用域构建器,但它们的行为在错误处理方面有所不同。

  • coroutineScope:当一个子协程失败时,它会取消所有其他子协程,并且异常会传播到父协程。
  • supervisorScope:当一个子协程失败时,它不会影响其他子协程,异常也不会传播到父协程。

本题详细解读

coroutineScope

coroutineScope 是一个作用域构建器,它会创建一个新的协程作用域,并且在该作用域内的所有子协程都会遵循结构化并发原则。这意味着:

  • 如果其中一个子协程抛出异常,coroutineScope 会取消所有其他子协程。
  • 异常会传播到父协程,导致父协程也被取消。

示例代码:

在这个例子中,第一个子协程抛出异常后,第二个子协程会被取消,并且异常会被捕获并打印。

supervisorScope

supervisorScope 也是一个作用域构建器,但它与 coroutineScope 的主要区别在于错误处理方式:

  • 如果其中一个子协程抛出异常,supervisorScope 不会取消其他子协程。
  • 异常不会传播到父协程,父协程可以继续运行。

示例代码:

在这个例子中,第一个子协程抛出异常后,第二个子协程仍然会继续执行,并且父协程也不会被取消。

总结

  • 使用 coroutineScope 时,子协程的失败会导致整个作用域被取消。
  • 使用 supervisorScope 时,子协程的失败不会影响其他子协程,父协程也不会被取消。

根据具体需求选择合适的作用域构建器,以确保协程的错误处理符合预期。