Kotlin协程是否与线程工作机制相同?Android网络场景代码疑问
Kotlin协程计数器未交替输出的问题解决
问题描述
我正在学习用于Android网络开发的Kotlin协程,但不理解其工作机制。我的代码中两个计数器未交替输出(无法像线程那样混合显示),请问代码中缺少什么配置?是否应该替换runBlocking{}?
相关代码
import kotlinx.coroutines.* suspend fun counter(a: Int) { for(n in 0..a) { print(n.toString() + " ") } } fun main() { runBlocking { counter(10) launch { counter(10) } } }
当前输出
0 1 2 3 4 5 6 7 8 9 10 0 1 2 3 4 5 6 7 8 9 10
问题原因与解决方案
核心原因
- 执行顺序问题:你在
runBlocking里先直接调用了counter(10),这是同步执行的——当前协程会把这个函数从头到尾跑完,才会去执行后面的launch代码。 - 无挂起点:
counter是挂起函数,但内部没有任何挂起点(比如delay、withContext这类会让协程让出线程的操作),所以即便是在launch启动的协程里执行,它也会霸占线程直到完成,不会给其他协程执行机会。
解决步骤
- 同时启动两个协程:不要先同步执行第一个
counter,而是用launch同时启动两个协程任务。 - 添加挂起点:在
counter的循环中加入delay(1)(或者其他挂起函数),让协程每次循环时让出线程,给其他协程执行的机会。 - 无需替换
runBlocking{}:它的作用是在主线程中启动协程作用域,阻塞主线程直到所有协程完成,完全符合当前场景的需求。
修改后的代码
import kotlinx.coroutines.* suspend fun counter(a: Int) { for(n in 0..a) { print(n.toString() + " ") delay(1) // 添加挂起点,让出线程 } } fun main() { runBlocking { // 同时启动两个协程 launch { counter(10) } launch { counter(10) } } }
预期输出示例
输出会呈现交替的形式(每次运行结果可能略有不同):
0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
内容的提问来源于stack exchange,提问作者KrySoar
相关产品推荐
相关产品推荐

