Kotlin 协程基础 06:协程的轻量级特性

本篇文档解析 example-basic-06.kt,探讨为什么协程被称为“轻量级线程”。

1. 核心概念:协程 vs 线程

在传统的线程模型中,如果你创建 50,000 个线程,由于内存和系统调用开销,程序会迅速 OOM (OutOfMemoryError) 或崩溃。而协程可以轻松应对这种规模的任务。

代码解析

1
2
3
4
5
6
7
8
fun main() = runBlocking {
repeat(50_000) {
launch {
delay(5000L)
print(".")
}
}
}
  • 海量并发repeat(50_000) 表示我们要启动五万个协程。
  • 非线性等待:每个协程在 delay 时都会交出控制权,但不会占用操作系统线程。

2. 深入理解:为什么不崩溃?

  1. 内存占用极小:协程本质上是运行在 JVM 堆内存中的一些对象。一个线程通常需要约 1MB 的栈内存,而一个协程只需几十到几百个字节。
  2. **调度器 (Dispatcher)**:协程运行在线程池之上。50,000 个协程实际上由几十个实际的线程(通常等于 CPU 核心数)来“轮流轮换”处理。
  3. 挂起 (Suspend) 的本质:当协程 delay 时,它只是被调度器标记为“待办任务”,而不是让线程“死等”。线程会立即转而处理其他就绪的协程。

3. 开发者总结

协程极大地提高了并发处理效率,它不再受限于操作系统的线程数量,让我们能够以接近 1:1 的模型处理成千上万个异步任务(如高并发服务器请求、大规模 UI 数据流处理等)。

,