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

Kotlin协程在命令行环境无输出问题求助

为什么我的Kotlin协程程序没有输出"hello"?

你的代码和运行命令如下:

代码(Main.kt)

//Main.kt
import kotlinx.coroutines.*
import java.util.concurrent.*

fun main() {
        val scope = CoroutineScope(Job() + Dispatchers.Default)

        scope.launch{
                println("hello")
        }
}

运行命令

i@LAPTOP:/mnt/d/PROJECTS$ ls
Main.kt  annotations-23.0.0.jar  kotlin-stdlib-1.9.21.jar  kotlinx-coroutines-core-jvm-1.8.0-RC2.jar
i@LAPTOP:/mnt/d/PROJECTS$ kotlinc Main.kt -cp annotations-23.0.0.jar:kotlin-stdlib-1.9.21.jar:kotlinx-coroutines-core-jvm-1.8.0-RC2.jar
i@LAPTOP:/mnt/d/PROJECTS$ java -cp annotations-23.0.0.jar:kotlin-stdlib-1.9.21.jar:kotlinx-coroutines-core-jvm-1.8.0-RC2.jar:. MainKt

问题原因

核心问题是主函数在协程完成执行前就退出了:

  • 你创建的CoroutineScope基于自定义Job,它的生命周期和主线程完全独立。
  • 当main()函数执行到最后一行时,JVM会直接终止整个进程,包括协程所在的后台线程,此时协程还没来得及执行println("hello")语句。

解决方法

方法1:等待协程执行完成

保存launch返回的Job对象,调用join()方法等待协程结束。可以用runBlocking提供一个能阻塞主线程的协程作用域:

import kotlinx.coroutines.*

fun main() = runBlocking {
    val scope = CoroutineScope(Job() + Dispatchers.Default)
    val job = scope.launch {
        println("hello")
    }
    job.join() // 阻塞直到协程执行完毕
}

方法2:直接使用runBlocking作为主作用域

runBlocking会自动阻塞主线程,直到其内部所有协程执行完成,无需额外处理:

import kotlinx.coroutines.*

fun main() = runBlocking {
    launch(Dispatchers.Default) {
        println("hello")
    }
}

方法3:临时延迟主线程(不推荐)

通过Thread.sleep()让主线程等待一段时间,给协程执行机会。但这种方法不可靠,因为无法准确预估协程执行时间:

import kotlinx.coroutines.*

fun main() {
    val scope = CoroutineScope(Job() + Dispatchers.Default)
    scope.launch {
        println("hello")
    }
    Thread.sleep(1000) // 等待1秒,让协程有机会执行
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:17:47