Kotlin 协程基础 04:并发执行与作用域边界

本篇文档解析 example-basic-04.kt,探讨如何在同一个作用域内处理多个并发任务。

1. 核心概念:多个 launch 的并发行为

在同一个 coroutineScoperunBlocking 中,如果你连续调用多个 launch,它们会立即并发执行,而不会互相等待。

代码解析

1
2
3
4
5
6
7
8
9
10
11
suspend fun doWorld() = coroutineScope { 
launch {
delay(2000L)
println("World 2")
}
launch {
delay(1000L)
println("World 1")
}
println("Hello")
}
  • 并行启动:两个 launch 块几乎同时启动。
  • 非阻塞主流程println("Hello") 会在 launch 启动后立即执行,不会等待 1 秒或 2 秒。
  • 自动等待完成coroutineScope 会确保其内部的所有子协程(World 1 和 World 2)都完成后,doWorld() 函数才会返回。

2. 输出顺序分析

  1. Hello:主流程立即打印。
  2. World 1:经过 1000ms 后打印(因为它延迟最短)。
  3. World 2:经过 2000ms 后打印(从开始计时起)。

3. 开发者感悟

可以将 launch 理解为向 CoroutineScope 注册了一个待执行的任务。这些任务被“塞”进作用域后,它们在各自的轨道上并行运行。这种模式极大地简化了复杂的异步逻辑,避免了传统回调地狱。

,