Kotlin 协程(Coroutines)常被称为“非阻塞式挂起”,它允许开发者以同步的思维编写异步非阻塞代码。与 Go 语言在运行时层面管理协程调度不同,Kotlin 协程的轻量级与非侵入性完全依赖于编译期代码转换(CPS Transform)与有限状态机(Finite State Machine)。在 Kotlin 中,被 suspend 修饰的函数在经过编译器编译后,其函数签名会被隐式注入一个延续参数:Continuation。例如:Kotlinsuspend fun fetchData(): String // 编译后降级为: fun fetchData(continuation: Continuation): Any? 如果函数内部包含多个挂起点,编译器会将该挂起函数的整个函数体重新打包为一个继承自 ContinuationImpl 的内部匿名类。代码中的每一个挂起点都被划分为状态机的一个分支(State Label):Kotlin// 伪代码表示编译后的状态机骨架 when (continuation.label) { 0 -> { continuation.label = 1 val result = doNetworkCall(continuation) if (result == COROUTINE_SUSPENDED) return COROUTINE_SUSPENDED // 若同步完成,继续向下流转 } 1 -> { val data = continuation.result continuation.label = 2 processData(data, continuation) } } 当真正遇到需要耗时等待的 I/O 时,函数直接向调用栈返回特殊标记 COROUTINE_SUSPENDED,当前线程立刻从该调用栈帧中被释放,回退去执行其他任务。直到底层异步任务完成并回调 continuation.resumeWith(),状态机重新切回之前的执行点继续往下流转,在完全不阻塞底层线程的前提下实现了极致的资源利用率。