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

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 

问题原因与解决方案

核心原因

  1. 执行顺序问题:你在runBlocking里先直接调用了counter(10),这是同步执行的——当前协程会把这个函数从头到尾跑完,才会去执行后面的launch代码。
  2. 无挂起点:counter是挂起函数,但内部没有任何挂起点(比如delay、withContext这类会让协程让出线程的操作),所以即便是在launch启动的协程里执行,它也会霸占线程直到完成,不会给其他协程执行机会。

解决步骤

  1. 同时启动两个协程:不要先同步执行第一个counter,而是用launch同时启动两个协程任务。
  2. 添加挂起点:在counter的循环中加入delay(1)(或者其他挂起函数),让协程每次循环时让出线程,给其他协程执行的机会。
  3. 无需替换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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 08:15:42