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
相关产品推荐
相关产品推荐

