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

本文涉及的产品
视觉智能开放平台,分割抠图1万点
NLP 自学习平台,3个模型定制额度 1个月
NLP自然语言处理_高级版,每接口累计50万次
简介: 【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语言中的新并行构造,但它们确实为特定情境提供一种独特的解决方案。

目录
相关文章
|
4月前
|
Oracle Java API
虚拟线程:Java的新利器?
作者通过本文梳理了自己对虚拟线程的理解,顺便捋一捋Java线程的过去、现在和未来。ps:写这篇文章的时候,Java 19刚刚发布,而现在Java 21已经正式GA了,不过虚拟线程的API和底层实现并没有什么变化。
|
2月前
|
Java 开发者
如何通过易语言多线程提升程序响应速度
如何通过易语言多线程提升程序响应速度
198 62
|
26天前
|
安全 Java
线程安全的艺术:确保并发程序的正确性
在多线程环境中,确保线程安全是编程中的一个核心挑战。线程安全问题可能导致数据不一致、程序崩溃甚至安全漏洞。本文将分享如何确保线程安全,探讨不同的技术策略和最佳实践。
35 6
|
2月前
|
算法 NoSQL Java
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
这篇文章介绍了Spring Boot 3中GraalVM Native Image Support的新特性,提供了将Spring Boot Web项目转换为可执行文件的步骤,并探讨了虚拟线程在Spring Boot中的使用,包括如何配置和启动虚拟线程支持。
130 9
Springboot3新特性:GraalVM Native Image Support和虚拟线程(从入门到精通)
|
2月前
|
Java 关系型数据库 MySQL
如何用java的虚拟线程连接数据库
本文介绍了如何使用Java虚拟线程连接数据库,包括设置JDK版本、创建虚拟线程的方法和使用虚拟线程连接MySQL数据库的示例代码。
65 6
如何用java的虚拟线程连接数据库
|
2月前
|
Java 开发者
如何通过易语言多线程提升程序响应速度?
如何通过易语言多线程提升程序响应速度?
|
3月前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
131 23
|
2月前
|
Java 应用服务中间件 测试技术
Java21虚拟线程:我的锁去哪儿了?
【10月更文挑战第8天】
46 0
|
4月前
|
Rust 并行计算 安全
揭秘Rust并发奇技!线程与消息传递背后的秘密,让程序性能飙升的终极奥义!
【8月更文挑战第31天】Rust 以其安全性和高性能著称,其并发模型在现代软件开发中至关重要。通过 `std::thread` 模块,Rust 支持高效的线程管理和数据共享,同时确保内存和线程安全。本文探讨 Rust 的线程与消息传递机制,并通过示例代码展示其应用。例如,使用 `Mutex` 实现线程同步,通过通道(channel)实现线程间安全通信。Rust 的并发模型结合了线程和消息传递的优势,确保了高效且安全的并行执行,适用于高性能和高并发场景。
77 0

相关实验场景

更多
下一篇
DataWorks