JEP 444: 虚拟线程在JDK 21中进入目标状态
JEP 444(虚拟线程)已从Proposed to Target状态提升为Targeted状态,并将在JDK 21中正式发布。虚拟线程是一种轻量级线程,旨在显著减少在Java平台上编写、维护和观察高吞吐量并发应用程序的工作量。该JEP基于前两轮预览(JDK 19中的JEP 425和JDK 20中的JEP 436)的反馈,最终确定了这一特性。
虚拟线程与平台线程的区别
Java现在有两种线程类型:
- 平台线程:传统的线程,直接映射到操作系统线程。
- 虚拟线程:由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;
});
});
}线程局部变量与虚拟线程
虚拟线程支持ThreadLocal和InheritableThreadLocal变量,但由于虚拟线程数量庞大,开发人员应谨慎使用线程局部变量。JDK提供了jdk.traceVirtualThreadLocals系统属性,用于在虚拟线程设置线程局部变量时触发堆栈跟踪。
并发包与虚拟线程
java.util.concurrent包现在支持虚拟线程。LockSupport API已更新,以优雅地暂停和恢复虚拟线程,使Locks、Semaphores和BlockingQueues等API能够无缝与虚拟线程协作。Executors.newThreadPerTaskExecutor和Executors.newVirtualThreadPerTaskExecutor方法提供了为每个任务创建新线程的ExecutorService,便于与现有代码的迁移和互操作。
网络API与虚拟线程
java.net和java.nio.channels包中的网络API现在支持虚拟线程,提高了并发应用程序的效率。虚拟线程上的阻塞操作会释放底层平台线程,而Socket、ServerSocket和DatagramSocket类中的I/O方法已支持中断,从而提升了性能和一致性。
I/O包与虚拟线程
java.io包已更新,以避免在虚拟线程中使用时出现“固定”问题。BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter、PrintStream和PrintWriter现在使用显式锁而不是监视器。InputStreamReader和OutputStreamWriter的流解码器和编码器使用与它们相同的锁。
JNI与虚拟线程
JNI引入了新函数IsVirtualThread,用于测试对象是否为虚拟线程,但JNI规范的其他部分保持不变。
调试架构与虚拟线程
JVM TI、JDWP和JDI调试架构已更新,支持虚拟线程。这些接口现在支持虚拟线程的启动和结束事件,以及虚拟线程的批量挂起和恢复。
JFR与虚拟线程
JDK Flight Recorder(JFR)现在支持虚拟线程,新增了jdk.VirtualThreadStart、jdk.VirtualThreadEnd、jdk.VirtualThreadPinned和jdk.VirtualThreadSubmitFailed事件,提供了对虚拟线程行为的深入洞察。
JMX与虚拟线程
JMX通过ThreadMXBean接口继续仅支持平台线程。HotSpotDiagnosticsMXBean接口新增了一个方法,用于生成支持虚拟线程的新样式线程转储。
兼容性风险
尽管虚拟线程带来了显著的性能提升,开发人员应注意现有API及其实现的变化可能带来的兼容性风险,包括java.io包中内部锁定协议的修改,以及可能影响扩展Thread类的代码的源和二进制不兼容性变化。
总结
虚拟线程标志着Java在支持高并发和可扩展应用程序方面的重要里程碑。通过更高效和轻量级的线程模型,开发人员可以轻松处理数百万个任务,并更好地利用系统资源。更多详细信息可参考JEP 425的相关资源。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。