同一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
原因解释
- 协程的顺序执行特性:你在同一个
launch创建的协程里,按顺序调用了suspendFunction()和suspendFunction2()。协程的执行流程是单线程式的线性流程——必须等前一个函数执行完成(包括挂起后恢复),才会调用下一个函数。 - 挂起的本质:
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
相关产品推荐
相关产品推荐

