JEP 444:虚拟线程在JDK 21中到来,开启并发新时代

JEP 444: 虚拟线程在JDK 21中进入目标状态

JEP 444(虚拟线程)已从Proposed to Target状态提升为Targeted状态,并将在JDK 21中正式发布。虚拟线程是一种轻量级线程,旨在显著减少在Java平台上编写、维护和观察高吞吐量并发应用程序的工作量。该JEP基于前两轮预览(JDK 19中的JEP 425和JDK 20中的JEP 436)的反馈,最终确定了这一特性。

虚拟线程与平台线程的区别

Java现在有两种线程类型:

  1. 平台线程:传统的线程,直接映射到操作系统线程。
  2. 虚拟线程:由JDK提供的轻量级线程,可以在一个操作系统线程上运行多个虚拟线程。虚拟线程为平台线程提供了更高效的替代方案,允许开发人员以更低的开销处理大量任务。

虚拟线程的优势

  • 兼容性:虚拟线程与现有Java代码兼容,提供了无缝迁移路径。
  • 高效性:可以在少量操作系统线程上运行大量虚拟线程,显著提高资源利用率。

示例代码

以下代码展示了如何使用虚拟线程执行10,000个并发任务:

try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 10_000).forEach(i -> {
        executor.submit(() -> {
            Thread.sleep(Duration.ofSeconds(1));
            return i;
        });
    });
}

线程局部变量与虚拟线程

虚拟线程支持ThreadLocalInheritableThreadLocal变量,但由于虚拟线程数量庞大,开发人员应谨慎使用线程局部变量。JDK提供了jdk.traceVirtualThreadLocals系统属性,用于在虚拟线程设置线程局部变量时触发堆栈跟踪。

并发包与虚拟线程

java.util.concurrent包现在支持虚拟线程。LockSupport API已更新,以优雅地暂停和恢复虚拟线程,使LocksSemaphoresBlockingQueues等API能够无缝与虚拟线程协作。Executors.newThreadPerTaskExecutorExecutors.newVirtualThreadPerTaskExecutor方法提供了为每个任务创建新线程的ExecutorService,便于与现有代码的迁移和互操作。

网络API与虚拟线程

java.netjava.nio.channels包中的网络API现在支持虚拟线程,提高了并发应用程序的效率。虚拟线程上的阻塞操作会释放底层平台线程,而SocketServerSocketDatagramSocket类中的I/O方法已支持中断,从而提升了性能和一致性。

I/O包与虚拟线程

java.io包已更新,以避免在虚拟线程中使用时出现“固定”问题。BufferedInputStreamBufferedOutputStreamBufferedReaderBufferedWriterPrintStreamPrintWriter现在使用显式锁而不是监视器。InputStreamReaderOutputStreamWriter的流解码器和编码器使用与它们相同的锁。

JNI与虚拟线程

JNI引入了新函数IsVirtualThread,用于测试对象是否为虚拟线程,但JNI规范的其他部分保持不变。

调试架构与虚拟线程

JVM TI、JDWP和JDI调试架构已更新,支持虚拟线程。这些接口现在支持虚拟线程的启动和结束事件,以及虚拟线程的批量挂起和恢复。

JFR与虚拟线程

JDK Flight Recorder(JFR)现在支持虚拟线程,新增了jdk.VirtualThreadStartjdk.VirtualThreadEndjdk.VirtualThreadPinnedjdk.VirtualThreadSubmitFailed事件,提供了对虚拟线程行为的深入洞察。

JMX与虚拟线程

JMX通过ThreadMXBean接口继续仅支持平台线程。HotSpotDiagnosticsMXBean接口新增了一个方法,用于生成支持虚拟线程的新样式线程转储。

兼容性风险

尽管虚拟线程带来了显著的性能提升,开发人员应注意现有API及其实现的变化可能带来的兼容性风险,包括java.io包中内部锁定协议的修改,以及可能影响扩展Thread类的代码的源和二进制不兼容性变化。

总结

虚拟线程标志着Java在支持高并发和可扩展应用程序方面的重要里程碑。通过更高效和轻量级的线程模型,开发人员可以轻松处理数百万个任务,并更好地利用系统资源。更多详细信息可参考JEP 425的相关资源。

阅读 327
0 条评论