JEP 444,Virtual Threads,从JDK 21 的 Candidate 提升到 Proposed到Target状态。此功能提供虚拟线程,轻量级线程,可显着减少在 Java 平台上编写、维护和观察高吞吐量并发应用程序的工作量。本 JEP 打算根据前两轮预览的反馈最终确定此功能:JEP 436,Virtual Threads (Second Preview),在 JDK 20 中交付;和 JEP 425,虚拟线程(预览版),在 JDK 19 中提供。
通过这个 JEP,Java 现在有两种类型的线程:传统线程,也称为平台线程和虚拟线程。平台线程是对操作系统线程的一对一包装,而虚拟线程是由 JDK 提供的轻量级实现,可以在同一操作系统线程上运行多个虚拟线程。虚拟线程为平台线程提供了更高效的替代方案,允许开发人员以显着降低的开销处理大量任务。这些线程提供与现有 Java 代码的兼容性和无缝迁移路径,以受益于增强的性能和资源利用率。考虑以下示例:
JDK 现在可以在少量的操作系统 (OS) 线程上运行多达 10,000 个并发虚拟线程,即使只有一个,也可以执行上面涉及休眠一秒钟的简单代码。
虚拟线程旨在与线程局部变量和可继承的线程局部变量一起使用,就像平台线程一样。但是,由于可以创建大量虚拟线程,开发人员应谨慎使用线程局部变量。为了帮助迁移到虚拟线程,JDK 提供了一个系统属性,jdk.traceVirtualThreadLocals它会在虚拟线程设置任何线程局部变量的值时触发堆栈跟踪。
该java.util.concurrent软件包现在包括对虚拟线程的支持。APILockSupport 已更新,可以优雅地停放和取消停放虚拟线程,使使用锁、信号量和阻塞队列等的 APILockSupport能够与虚拟线程无缝运行。和方法提供了一个为每个任务创建一个新线程的方法,促进了迁移以及与使用线程池Executors.newThreadPerTaskExecutor(ThreadFactory)和.Executors.newVirtualThreadPerTaskExecutor()ExecutorServiceExecutorService
和包中的网络 API现在支持虚拟线程,提高了并发应用程序的效率。虚拟线程上的阻塞操作释放了底层平台线程,而 和 类中的 I/O 方法已成为可中断的。此更新促进了使用并发应用程序的 Java 开发人员的一致行为和改进的性能。 java.netjava.nio.channelsSocketServerSocketDatagramSocket
该java.io包为字节流和字符流提供 API,已更新以避免在虚拟线程中使用时固定。Pinning in virtual threads 是指将轻量级线程“卡住”到特定平台线程,由于阻塞操作而限制并发性和灵活性。BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter, PrintStream,PrintWriter现在直接使用显式锁而不是监视器。InputStreamReader和现在使用的流解码器和编码器OutputStreamWriter使用与其封闭的相同的锁InputStreamReaderor OutputStreamWriter。
Java 本机接口 ( JNI ) 引入了一个新函数,IsVirtualThread用于测试对象是否为虚拟线程。JNI 规范在其他方面保持不变。
由 JVM 工具接口 ( JVM TI )、Java 调试线协议 ( JDWP ) 和 Java 调试接口 ( JDI ) 组成的调试架构已更新为支持虚拟线程。所有三个接口现在都支持虚拟线程,并添加了新功能和方法来处理线程启动和结束事件以及虚拟线程的批量挂起和恢复。
JDK Flight Recorder ( JFR ) 现在支持具有新事件的虚拟线程,例如jdk.VirtualThreadStart、、 和。这些事件提供了对应用程序中虚拟线程行为的洞察力。jdk.VirtualThreadEndjdk.VirtualThreadPinnedjdk.VirtualThreadSubmitFailed
Java 管理扩展 ( JMX ) 将继续通过接口仅支持平台线程ThreadMXBean。接口中的新方法HotSpotDiagnosticsMXBean生成新式线程转储以支持虚拟线程。
虽然虚拟线程带来了显着的性能改进,但开发人员应该意识到由于现有 API 及其实现的变化而带来的兼容性风险。其中一些风险包括对java.io包和源代码中的内部锁定协议的修订以及可能影响扩展类的代码的二进制不兼容更改。 Thread
虚拟线程标志着 Java 支持高度并发和可伸缩应用程序的旅程中的一个重要里程碑。借助更高效、更轻量级的线程模型,开发人员现在可以轻松处理数百万个任务并更好地利用系统资源。开发人员可以利用 JEP 425 的更多详细信息,这些信息可以在 InfoQ 的新闻报道和由Oracle Java 平台组的 Java 开发倡导者José Paumard投射的JEP Café屏幕中找到。