Kotlin是否支持使用Project Loom?转译代码运行无输出问题咨询
问题根因
你遇到的无输出问题和Kotlin、Project Loom、JDK 18的兼容性没有任何关系,核心原因有两点:
- 你自行实现了一个空逻辑的
ExecutorService.use扩展方法,方法体内既没有执行传入的代码块,也没有处理资源关闭逻辑,导致包裹在use块内的所有代码根本没有被执行,自然不会有任何输出。 - 直接调用
Executors.newVirtualThreadExecutor().submit(...)无输出是因为虚拟线程默认是守护线程,JVM不会等待守护线程执行完成就会退出,主线程提交任务后直接结束,虚拟线程还没来得及执行打印逻辑进程就终止了。而newCachedThreadPool创建的是平台非守护线程,会阻止JVM退出直到任务执行完成,所以能看到输出。
Kotlin标准库本身已经为AutoCloseable接口(ExecutorService在JDK 19+已实现该接口)提供了原生的use扩展方法,功能和Java的try-with-resources完全对齐:执行传入的代码块后自动调用close()方法关闭资源,关闭ExecutorService时会等待所有已提交的任务执行完成,完全可以满足你的使用需求。
修复方案
删掉你自定义的空实现use扩展方法,直接使用Kotlin标准库提供的原生use方法即可,正确代码示例:
import java.util.concurrent.Executors import java.util.stream.IntStream fun main() { Executors.newVirtualThreadExecutor().use { executor -> IntStream.range(0, 16).forEach { i -> println("i = $i, Thread ID = ${Thread.currentThread()}") executor.submit { println("Thread ID = ${Thread.currentThread()}") } } } }
上述代码运行后输出和Java版本完全一致。
疑问解答
- Project Loom、JDK 18不存在与Kotlin适配的缺陷,虚拟线程可以在Kotlin中正常使用。
- Kotlin也不存在无法与Project Loom互操作的问题,和JDK 18也没有兼容性问题,当前异常完全是自定义错误代码导致。
内容的提问来源于stack exchange,提问作者Eric Kolotyluk
相关产品推荐
相关产品推荐

