Kotlin结构化并发协程示例运行异常及launch块执行问题咨询
为什么我的Kotlin协程launch块在delay(1000L)时没执行还崩溃?
兄弟,我之前也碰到过类似的诡异问题,咱们先理清楚逻辑,再找原因:
首先,你的代码逻辑本身是完全正确的!runBlocking作用域会自动等待它内部启动的所有子协程执行完毕后才会退出,所以不管你把delay(100L)改成delay(1000L),理论上都应该完整输出Hello,World!。
那为啥会出现只打印Hello,还崩溃(退出码-1073741819也就是Windows下的0xC0000005访问冲突)的情况?这大概率是环境或依赖的问题,不是代码逻辑的锅,给你几个排查方向:
- 协程库版本太旧:某些早期版本的Kotlin协程库在Windows平台存在内存访问的bug,建议直接升级到最新的稳定版。比如在你的构建文件里改成这样(以Gradle为例):
dependencies { implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3") implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:1.7.3") } - JDK版本兼容性问题:部分旧版JDK(比如JDK 8的某些小版本)和协程库搭配在Windows下会触发内存异常,你可以试试切换到JDK 11或17的稳定发行版,再运行代码。
- IDE运行配置问题:有时候IDE的运行配置会出问题,导致依赖没有正确加载。你可以尝试用命令行编译运行排除这个可能:
# 先下载对应版本的协程核心库jar,然后编译 kotlinc -cp "kotlinx-coroutines-core-jvm-1.7.3.jar" YourFileName.kt -include-runtime -d app.jar # 运行 java -jar app.jar - 依赖冲突:如果你的项目里有其他依赖和协程库版本冲突,也可能导致类加载异常触发内存错误。可以用Gradle的
./gradlew dependencies命令查看依赖树,排查有没有冲突的协程库版本。
按照上面的步骤排查,基本就能解决这个问题了,毕竟你的代码本身是符合结构化并发规范的,正常情况下肯定能正确执行。
内容的提问来源于stack exchange,提问作者Владислав Прасков
相关产品推荐
相关产品推荐

