You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一launch块内Kotlin协程执行顺序疑问:delay时为何不执行后续挂起函数

Kotlin协程中挂起函数为何不会并发执行?

你的核心疑问在于:同一个协程内,前一个挂起函数执行delay时,为什么后一个挂起函数不会开始执行?这是因为协程内的代码默认是顺序执行的,哪怕调用了挂起函数,也不会打破这个线性执行逻辑。

先看你的代码(修正了语法错误:Dispatchers.Main应作为launch的参数传入):

fun main(args: Array<String>): Unit {
  runBlocking {
    println("A")
    launch(Dispatchers.Main) {
      suspendFunction()
      suspendFunction2()
    }
    println("I am here")
  }
}

suspend fun suspendFunction() {
  println("Running on thread: ${Thread.currentThread().name}")
  delay(10000) // 模拟挂起操作
  println("B")
}

suspend fun suspendFunction2() {
  println("Running on thread: ${Thread.currentThread().name}")
  delay(1000) // 模拟挂起操作
  println("C")
}

输出结果:

A
I am here
Running on thread: main
B
Running on thread: main
C

原因解释

  1. 协程的顺序执行特性:你在同一个launch创建的协程里,按顺序调用了suspendFunction()和suspendFunction2()。协程的执行流程是单线程式的线性流程——必须等前一个函数执行完成(包括挂起后恢复),才会调用下一个函数。
  2. 挂起的本质:delay会让当前协程暂停执行,释放所在线程去处理其他任务(比如这里runBlocking里的"I am here"就是在协程挂起时执行的),但这个协程的执行指针会停在delay的位置,等延迟结束后,协程恢复,继续执行suspendFunction()剩下的代码(打印"B"),执行完这个函数后,才会进入suspendFunction2()。

如果想让两个挂起函数并发执行

如果要让两个挂起函数同时执行(也就是suspendFunction()挂起时,suspendFunction2()开始执行),需要把它们放到不同的协程里,比如用launch分别启动:

runBlocking {
  println("A")
  launch(Dispatchers.Main) {
    suspendFunction()
  }
  launch(Dispatchers.Main) {
    suspendFunction2()
  }
  println("I am here")
}

这样输出会变成(C会在B之前打印,因为suspendFunction2()的延迟更短):

A
I am here
Running on thread: main
Running on thread: main
C
B

内容的提问来源于stack exchange,提问作者sarah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 22:20:21