真没想到!虚拟线程竟然这样提高程序效率!

本文涉及的产品
多模态交互后付费免费试用,全链路、全Agent
简介: 【10月更文挑战第13天】

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语言中的新并行构造,但它们确实为特定情境提供一种独特的解决方案。

目录
相关文章
Java 数据库 Spring
46 0
|
2月前
|
Java API 调度
从阻塞到畅通:Java虚拟线程开启并发新纪元
从阻塞到畅通:Java虚拟线程开启并发新纪元
299 83
|
2月前
|
存储 Java 调度
Java虚拟线程:轻量级并发的革命性突破
Java虚拟线程:轻量级并发的革命性突破
245 83
|
2月前
|
Java API 微服务
为什么虚拟线程将改变Java并发编程?
为什么虚拟线程将改变Java并发编程?
258 83
|
4月前
|
Kubernetes Linux Go
使用 Uber automaxprocs 正确设置 Go 程序线程数
`automaxprocs` 包就是专门用来解决此问题的,并且用法非常简单,只需要使用匿名导入的方式 `import _ "go.uber.org/automaxprocs"` 一行代码即可搞定。
243 78
|
10月前
|
安全 Java
线程安全的艺术:确保并发程序的正确性
在多线程环境中,确保线程安全是编程中的一个核心挑战。线程安全问题可能导致数据不一致、程序崩溃甚至安全漏洞。本文将分享如何确保线程安全,探讨不同的技术策略和最佳实践。
163 6
|
11月前
|
Java 开发者
如何通过易语言多线程提升程序响应速度?
如何通过易语言多线程提升程序响应速度?
|
11月前
|
Java 开发者
如何通过易语言多线程提升程序响应速度
如何通过易语言多线程提升程序响应速度
526 62
|
11月前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
242 0