0 前言
自Java 19以来一直在试验的功能得到了长期支持而感到高兴。但若你不确定虚拟线程是啥或它对你的Java开发意味啥?别担心……看完本文即可!
1 啥是虚拟线程?
虚拟线程是轻量级线程,能够简化编写和维护高计算要求的并发应用程序的过程。
传统的平台线程很重,即它们使用大量计算资源,且与os线程1:1绑定,这意味着线程执行时间依赖CPU执行时间。
每个这样的线程可能会使用多达10G内存;若应用程序的复杂性增加,这些线程的数量很快就会累积。每个请求都分配一个线程。虽然传统线程在开发应用程序时提供了一定的简单性,但由于缺乏灵活性,大型应用程序常常因代码的请求数量而受到影响。
相反,虚拟线程将调度线程的责任从操作系统移交给JVM(Java虚拟机),这在操作系统和应用程序之间引入了一个抽象层。
1.1 虚拟线程示例
Runnable fn = () -> {
// code };
Thread thread = Thread.ofVirtual(fn) .start();
Thread thread = Thread.startVirtualThread(() -> {
// code });
2 虚拟线程咋成为JDK永久功能
虚拟线程最早在Java 19作为预览功能提出。当时,它们在Project Loom已开发数年,并最终通过JEP 425引入JDK。虚拟线程是结构化并发的前提条件。
Java 20中,虚拟线程再次作为预览功能出现,伴随JEP 436。Java开发者的反馈帮助最终确定了该功能,使其成为Java 21一部分。改进包括:
- 支持线程局部变量
- 使用Thread.Builder API创建的线程的默认监控
随着这些改进落实,虚拟线程在Java 21成为JDK永久功能。
3 虚拟线程的目的是啥?
虚拟线程是为实现多个特定目的而设计:
- 使Java开发者能以简单的每个请求一个线程的方式编写服务器应用程序。由于服务器应用程序需要独立处理每个用户请求,因此为每个请求分配一个独立的线程非常合理
- 使Java开发可用简单的每请求一个线程的风格来编写服务器应用程序
- 通过消除os作为性能的限制因素,虚拟线程使Java开发者能够最大限度地利用硬件性能
还支持现有JDK工具,使调试、故障排除和性能分析更加简单。
虚拟线程能通过支持现有的java.lang.Thread API代码,以最小的代码修改进行实现。这也是JEP 444主要目标之一。
3.1 虚拟线程的非目标声明
JEP 444中明确表示的非目标。虚拟线程不打算改变Java的基本并发模型,也不会取代传统线程。也不是作为Java语言或Java库中的新并行构造;Stream API仍是并行处理大型数据集的更有效方法。
3.2 缓解虚拟线程性能问题
虚拟线程是为克服传统线程性能瓶颈,并帮助Java开发最大限度发挥硬件性能。虚拟线程一个主要目标是降低线程开销,使开发者可在不遭遇性能瓶颈情况下创建更多线程。
这些新功能最大优势之一:虚拟线程与其他非虚拟线程比,代码差异很小。
若处理CPU密集型任务,如运行视频游戏,虚拟线程可能不会带来明显性能提升。
3.3 注意事项
虽然Java开发还在探索咋将虚拟线程最好整合到他们的工作流,但有些最佳实践值得注意。
- 每个任务启动一个新的虚拟线程
- 别将虚拟线程池化
- 大多数虚拟线程具有浅层调用栈,因此生命周期通常较短
4 总结
通过引入虚拟线程,Java开发能将调度线程的责任从os转移到应用程序服务器,从而突破传统线程的限制。虽然虚拟线程并不构成Java语言中的新并行构造,但它们确实为特定情境提供一种独特的解决方案。