性能提升 200% !SpringBoot 虚拟线程来啦!!

虚拟线程在SpringBoot中的应用——鸟枪换大炮 从上面的性能对比来看,虚拟线程在性能方面有明显的优势,但是要注意的是,我们上面的测试都是让线程等待了50ms,这是模拟什么场景?没错,是IO密集型场景,即线程大部分时间是在等待IO,这样虚拟线程才可以发挥出它的优势,如果是CPU密集型场景,那么可能效果并不大。不过我们目前大部分的应用都是IO密集型应用较多,比如典型的WEB应用,大量的时间在等待网络IO(DB、缓存、HTTP等等),使用虚拟线程的效果还是非常明显的。 阅读详情

在以往的项目中,我们面临了这样一种情况:我们收到了数千个认证请求。为了确保安全性,我们依靠第三方系统发送短信 OTP 进行验证。然而,有时候第三方系统花费的时间比预期的要长,导致延迟。我们采用了每个请求一个线程的模型,这意味着许多线程处于等待状态,并且新请求都在队列中。我们试图通过微调线程数量来优化性能,但当时我们希望有虚拟线程功能。当时 Java 中没有虚拟线程的概念,这就是 Project Loom 的作用。

虚拟线程

什么是 Project Loom?

什么是 Project Loom?这是 Oracle 的一个新项目,主要目标是显著减少编写、维护和观察高吞吐量并发应用程序的工作量。换句话说,Project Loom 旨在支持和推进一个高吞吐量、轻量级的 Java 并发模型,因为传统的操作系统线程(Java 并发模型的核心)有一些缺点,并且在计算上相当昂贵。反之,虚拟线程是更轻量级的线程,不与操作系统线程连接(由 JVM 管理)。这意味着虚拟线程是“每请求对应一个线程”编程的理想选择,可以创建大量的虚拟线程,而不会降低吞吐量。开发人员可以使用现有的 JDK 工具和技术快速排除故障、调试和分析并发应用程序,在发布的 Spring Boot 3.1 中可用。作为 Spring 开发者,了解虚拟线程的概念并理解它们在开发过程中的重要性非常关键。

如何使用虚拟线程

Java 版本选择

Java 19 中引入的虚拟线程非常易于使用,笔者使用的 Mac M1 系列,这里选择 Azul Zulu 发行版 20.30.11 版本 。

地址:https://www.azul.com/downloads/?version=java-20-sts&os=macos&architecture=arm-64-bit&package=jdk#zulu

azul 20

创建测试项目

使用 Spring Initializer 或 IDE 创建项目。添加 spring-web 依赖项并添加元数据。(注意版本选择 SpringBoot 3.1 ,Java 20)

开启虚拟线程功能

默认报错

默认情况下, Java19 的虚拟线程功能是禁用状态的,需要通过相关 maven 编译配置开启。

  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
  </plugin>
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <configuration>
      <compilerArgs>--enable-preview</compilerArgs>
    </configuration>
  </plugin>
  • 通过配置 bean 启用虚拟线程

 @Bean
 TomcatProtocolHandlerCustomizer<?> threadExecutorCustomizer() {
  return protocolHandler -> protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());
 }

这个 Bean 是一个自定义的 Tomcat 协议处理器,负责处理 Spring Boot 应用程序中传入的请求。这个自定义程序的目的是配置协议处理器使用的执行器。

在 threadExecutorCustomizer 方法内部,使用 Lambda 表达式来自定义协议处理器。protocolHandler 参数代表正在自定义的 Tomcat 协议处理器的实例。

在 Lambda 表达式中,调用 protocolHandler 对象的 setExecutor() 方法,用于为协议处理器设置执行器。执行器负责执行任务,例如处理传入的请求。

在这种情况下,使用 Executors.newVirtualThreadPerTaskExecutor() 方法创建一个新的使用虚拟线程的执行器。虚拟线程是轻量级线程,可以在单个操作系统线程中并发执行任务。这意味着可以同时执行多个任务,提高性能和资源利用率。

增加测试端点

@Slf4j
@RequestMapping
@RestController
public class DemoController {
    @GetMapping("/")
    public String demo() {
        try {
            TimeUnit.MILLISECONDS.sleep(300);
        } catch (InterruptedException e) {
            log.error(e.getMessage());
        }
        return "Current Thread Name: " + Thread.currentThread();
    }
}

上手使用

我们可以通过 Thread.currentThread() API 获取当前请求线程的元信息,以判断虚拟线程是否已经正确开启。

性能测试对比

100 线程测试

  • 不开启虚拟线程

吞吐量 300/s

  • 开启虚拟线程

吞吐量 300/s

300 线程测试

  • 不开启虚拟线程

吞吐量 650/s

  • 开启虚拟线程

吞吐量 950/s

500 线程测试

  • 不开启虚拟线程

吞吐量 650/s

  • 开启虚拟线程

吞吐量 1500/s

图表输出

总结

通过以上我们发现,在处理阻塞操作时,虚拟线程特别有益。随着并发请求数量的增加,虚拟线程的性能提升越来越明显。上述测试都是在未对 Spring Boot 项目进行调优和优化的情况下进行的。

使用 Project Loom 实现轻量级线程并发 Project Loom 是 Java 开发者社区正在积极推进的一个项目,旨在通过引入虚拟线程(Virtual Thread)为 Java 提供更高效的并发处理能力。传统 Java 线程是直接映射到操作系统的线程上的,这意味着每创建一个线程,操作系统需要分配内存栈和其他资源。而 Project Loom 中的虚拟线程则是运行在 Java 虚拟机 (JVM) 上的轻量级线程,能够在极低的开销下实现成千上万的并发操作。Project Loom 的引入彻底改变了 Java 并发编程的传统模式。 阅读详情

相关推荐

【Java虚拟线程】Java21、SpringBoot3中使用虚拟线程

最近有读取文件中数据的需求,且数据量百万至千万,普通的多线程读取方式还是很慢。遂想到Java21中虚拟线程,在网上学习了一圈,简单的在这里记一个笔记,方便日后查找。

m0_53928179的博客 1万+

Spring Boot 中的虚拟线程

虚拟线程作为 Java 中的一项功能引入,旨在简化并发性。Virtual threads 是 轻量级的线程,由 Java Virtual Machine 而不是操作系统管理。它们被设计为易于使用且高效,为并发编程提供了比传统 Java 线程更简单的模型。Lightweight :与传统线程相比,虚拟线程的重量更轻。它们由 JVM 管理,许多虚拟线程可以映射到较少数量的操作系统线程。Concurrency :虚拟线程旨在通过更轻松地编写可扩展和响应式应用程序来简化并发编程。

xuejianxinokok的专栏 1571

2026虚拟线程(Loom)实战调优:让Java服务性能提升3倍的配置密码

虚拟线程(Loom)是JDK21最具革命性的特性,彻底打破了IO密集型Java服务的线程资源天花板。通过本文的反常识配置、场景化调优和代码规范,我们在生产环境中实现了3倍性能提升,同时降低了硬件成本和运维复杂度。全面采用替代ThreadLocal,适配虚拟线程原生规范;结合ZGC+虚拟线程,构建超低延迟微服务架构;基于Service Mesh+虚拟线程,实现全链路无阻塞调用;探索虚拟线程在Serverless场景下的极致弹性能力。最后提醒:虚拟线程不是银弹,选对场景、遵守规范、配合监控。

2601_94871597的博客 745

Java 异步编程:从 Future 到 Loom

众所周知,Java 开始方法执行到结束,都是由同一个线程完成的。这种方式虽易于开发调试,但容易因为锁、IO 等原因导致线程挂起,产生线程上下文切换。随着对应用并发能力要求越来越高,频繁的线程上下文切换所带来的成本变得难以忽视。同时,线程也是相对宝贵的资源,无限制的增加线程是不可能的。优秀的技术人员应该能让应用使用更少的线程资源实现更高的并发能力。这便是我们今天要讨论的话题 —— Java 异步编程技术。 异步编程其实并没有清晰定义。通常我们认为,从方法开始到结束都必须在同一个线程内调度执行的编程方式可被认

hellozhxy的博客 1725

关于发那科机器人抓手及物料搬运阀配置

4:确保抓手阀岛和输入模块配网连接正常,MENU—SETUP—MH Valves—Details,详细界面进入到左上图所示,根据每组阀分配夹钳数量并应用。3:设置搬运有效,抓手是否带点焊可以自行选择,要设置应用选择,物料搬用工具数量,工具上阀岛的数量,夹钳存在数量,工具存在数量,以及真空吸盘,冷启动。​2:MENU—应用选择,将搬运置为有效,剩余其他项根据机器人实际用途进行选择。5:设置夹钳数量,检查打开夹钳,检查闭合夹钳,延迟时间要给选择配置应用。

dxs93的博客 4772

对族实例进行任意的矩阵变换,需要什么样的族?

问:一个小问题,想向您请教一下。 能不能实现一个这样的操作:创建了一个常规模型的FamilyInstance,然后知道旋转和平移的矩阵,能否根据变换矩阵更新FamilyInstance的位置,绕任意轴旋转任意角度。 请问什么样的实体才能在revit项目文件中任意旋转?貌似一般的实例只能在XY平面内旋转,并且LocationPoint中只有一个Rotation参数。答:您好,因为Revit里面的构件

我爱Revit —— BIM应用及BIM应用软件解决方案专栏 3626

SpringBoot 3.2虚拟线程压测:Tomcat吞吐量提升800%的奥秘

示例:4核CPU目标70%利用率 → 4×0.7×(1+0.8) ×2 ≈ 10个平台线程。最佳线程数 = (核心数 × 目标CPU利用率 × (1 + 等待时间/计算时间))《SpringBoot + WebGPU:浏览器直连的3D可视化方案》[吞吐量对比曲线图:显示并发用户从1k到10万时的QPS变化]❓ 当虚拟线程遇到Native方法阻塞时,应如何处理?等效虚拟线程数:无上限(受内存限制)× 虚拟线程系数(建议1.5-2)SpringBoot应用集群。A) 增加虚拟线程数。C) 改用平台线程池。

weixin_74887700的博客 1688

Ubuntu 22.04源码编译安装ROS Noetic

Ubuntu 22.04源码编译安装ROS Noetic

Drknown的博客 2万+

只用了一招,让 SpringBoot 项目性能提升了200%!

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。虚拟线程能处理更高并发的场景,特别是 I/O 密集型的应用,适合开发高并发、响应式的应用程序。虚拟线程 是 Java 并发编程的革新,它简化了线程管理,提升了高并发场景下的性能。使用虚拟线程,你可以轻松创建数十万甚至更多线程,而不会影响应用的性能。

weixin_44421461的博客 66

水文预报新手别怕!用Matlab 18小时搞定马斯京根法参数K和x(附完整代码)

本文详细介绍了如何使用Matlab在18小时内快速掌握水文预报中的马斯京根法参数K和x的求解方法。通过完整的代码示例和分步解析,帮助新手从理论到实践快速跨越,解决传统手工试算耗时耗力的问题,提升水文预报的效率和精度。

weixin_42573113的博客 254

调用IP核、移植/复制IP核以及解决IP核被锁住/红锁问题(基于vivado)

解决不同工程IP核之间复制调用以及IP核红锁问题,让开发更简单!

weixin_44502554的博客 1万+

《SpringBoot3.x 新特性:虚拟线程实战与性能对比》

虚拟线程是 Java 21 引入的轻量级线程机制,由 JVM 直接管理,而非操作系统内核。与传统线程相比,它创建和切换的开销极低,支持百万级并发,而不会导致资源耗尽。高并发能力:虚拟线程的创建成本接近零,适合 I/O 密集型应用(如 Web 服务)。简化编程:开发者无需手动管理线程池,代码更简洁。资源效率:减少内存占用和上下文切换开销。在 Spring Boot 3.x 中,虚拟线程通过简单配置即可启用,无需修改业务逻辑。

2501_93876039的博客 1090

自监督学习与上下文赌博机融合:视觉决策中的协同优化与实战指南

在机器学习领域,自监督学习(Self-Supervised Learning)通过设计前置任务从无标注数据中学习通用表征,已成为解决标注数据稀缺问题的关键技术。其核心原理是利用数据自身的结构生成监督信号,训练编码器提取鲁棒特征。上下文赌博机(Contextual Bandits)作为强化学习的简化分支,专注于在给定上下文信息下做出单步最优决策,平衡探索与利用,广泛应用于推荐系统、广告投放等场景。将两者结合,构建端到端的协同训练框架,能让视觉表征的优化直接服务于最终的决策目标,同时利用自监督任务作为正则化项提

weixin_33721344的博客 516

SpringBoot 虚拟线程实战:JDK 21 Virtual Threads 性能提升300%的完整方案

JDK 21 正式引入 Virtual Threads(虚拟线程),这是 Java 并发编程近20年来的最大变革。本文基于 SpringBoot 3.2+ 实战,深入解析 Virtual Threads 的工作原理、适用场景、配置方法和性能调优。通过电商高并发场景的真实案例,展示如何将系统吞吐量从 5,000 req/s 提升到 20,000 req/s,响应时间从 200ms 降低到 50ms。包含5个常见陷阱解决方案和完整的性能测试数据,帮助开发者快速掌握这一革命性技术。适合1-5年经验的Java后端开

腾讯云创作之星、华为云云享专家,深耕电商全栈高并发系统实战,分享可商用商城项目源码。 630

onnxruntime模型部署(一)-pythonAPI

简单模型的onnx模型的导出,以及onnxruntime推理引擎的模型部署

qq_45983373的博客 4059

Python爬虫实战:手把手教你如何抓取农作物品种名录,构建标准化种业索引数据库!

我长期专注 Python 爬虫工程化实战,主理专栏 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

喵手的博客 290

Java 21 虚拟线程实战:SpringBoot 3.2 应用吞吐量提升 3 倍配置指南

本文详细介绍了Java 21虚拟线程技术在SpringBoot 3.2中的应用实践,通过配置虚拟线程执行器和优化I/O密集型服务,显著提升应用吞吐量达3倍。文章包含性能对比、调优建议及生产环境注意事项,帮助开发者高效利用Java 21新特性提升系统性能。

weixin_30652897的博客 544

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

SpringBoot2与3性能对决:300%差距揭秘

作为后端开发,你是否在升级 Spring Boot 版本时陷入纠结:继续沿用熟悉的 Spring Boot2,还是冒险切换到 3.x 版本?两者的核心冲突并非简单的 “新老迭代”,而是技术架构、生态适配、性能上限的三重差异,直接影响项目的可扩展性与维护成本。对比维度底层依赖Spring Framework 6.x(原生支持 Java17+)异步性能基于 Servlet 3.1,异步支持有限内置虚拟线程(Project Loom),异步吞吐量提升 300%+生态适配。

Sgfcgg的博客 1710

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

让Java性能翻倍!免费神器虚拟线程实战,轻松吊打百万并发

Java 21虚拟线程技术带来革命性突破:传统线程池在高并发场景下存在内存爆炸风险(如10万并发需100GB内存),而虚拟线程通过轻量级绿色线程(仅需≈200MB内存)和智能调度机制,实现百万级并发处理。关键技术优势包括:IO阻塞时自动释放CPU资源、与现有Thread API完全兼容、无需修改业务逻辑。性能实测显示,在IO密集型场景下吞吐量提升8-10倍(10万并发从15秒降至3.2秒)。使用SpringBoot 3.2+通过简单配置即可启用,标志着Java高并发处理进入新时代。

yiridancan的博客 766

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

虚拟线程上线后Tomcat性能翻倍,你还在用传统线程?

提升Tomcat性能?揭秘Java 21虚拟线程在Tomcat中的吞吐量表现,通过轻量级线程模型显著降低资源开销,适用于高并发Web场景。相比传统线程,响应更快、吞吐更高,系统资源占用更少,性能翻倍不是梦,值得收藏。

VarPerch的博客 888

SpringBoot 3.2项目启用Java 21虚拟线程,性能提升真那么神?实测避坑指南

本文深入探讨了在SpringBoot 3.2项目中启用Java 21虚拟线程的性能优化与避坑实践。通过实测数据对比虚拟线程与传统线程、WebFlux的性能差异,揭示虚拟线程在高并发场景下的显著优势,并提供详细的配置指南和常见问题解决方案,帮助开发者高效升级至Java 21。

dgjm4087的博客 432

SpringBoot3 + Java21 虚拟线程实战:吞吐量提升 300%,彻底告别线程池调优

摘要: Java21虚拟线程(Virtual Threads)是并发编程的重大革新,SpringBoot3.2+原生支持一键开启。相比传统线程池,虚拟线程轻量级、无数量上限,阻塞时不占用调度资源,实测IO密集型场景吞吐量提升300%+。通过spring.threads.virtual.enabled=true即可零代码改造接入,特别适合微服务中DB/RPC/Redis等阻塞调用。需注意生产环境避免与传统线程池混用,且不适用于CPU密集型任务。2026年后虚拟线程将成为高并发项目标配,彻底解决线程池调优难题。

m0_75223114的博客 288

Spring Boot 3.3 虚拟线程优化:性能提升指南

虚拟线程采用 M:N 映射: $$ \text{虚拟线程数} \gg \text{OS 线程数} $$ 单机可支持百万级并发,资源消耗降低 90%+。随着 Java 21 引入虚拟线程(Virtual Threads),Spring Boot 3.3 深度整合了这项技术,显著提升了高并发场景的性能。满足关系: $$ \text{吞吐量增益} \propto \frac{\text{I/O 阻塞时间}}{\text{CPU 计算时间}} $$可查看虚拟线程状态。

llskdhxjhsd的博客 428

SpringBoot整合Java虚拟线程实战与性能优化

虚拟线程作为Java并发编程的重大革新,通过M:N调度模型实现了轻量级线程管理。相比传统平台线程1:1绑定OS线程的模式,虚拟线程由JVM直接调度,单个平台线程可承载数千个虚拟线程,栈空间按需分配。这种机制特别适合处理I/O密集型场景,能显著提升吞吐量并降低资源消耗。在SpringBoot应用中,通过配置Tomcat虚拟线程支持和优化异步任务处理,实测可使TPS提升3倍同时降低40%资源占用。结合连接池调优和ScopedValue等新特性,虚拟线程为高并发服务提供了新的技术解决方案。

weixin_29895109的博客 191

Java虚拟线程技术解析与SpringBoot实战

并发编程是现代系统设计的核心挑战,传统线程模型因操作系统线程资源消耗大、创建成本高,难以支撑高并发场景。虚拟线程作为用户态轻量级线程,通过JVM层调度和continuation机制实现高效上下文切换,内存占用仅为传统线程的千分之一。该技术显著提升吞吐量并降低响应延迟,特别适合微服务、Web服务器等IO密集型场景。结合SpringBoot 3.2+的自动配置能力,开发者只需简单调整线程池策略即可获得5倍以上的性能提升。实测数据显示,在商品查询等典型业务场景中,虚拟线程方案能实现18700 req/s的吞吐量,

weixin_30225755的博客 200

QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!

小伙伴们,你们有没有遇到过这种诡异的情况:服务器CPU不到30%,内存还剩一大半,可接口就是慢得像蜗牛,动不动就超时,用户投诉电话被打爆?压测的时候更气人——QPS死活卡在300,调线程池参数调到头秃,核心线程数从50改到500,最大线程数从200改到1000,队列容量从1000改到10000,结果QPS反而降了,真是越调越废。

冰河的专栏 768
上一篇: 这将是一场灾难?37年历史的PostgreSQL数据库将进行重大架构变更
下一篇: 程序员看剧,如果看到编程场景,会暂停看代码吗?
IT界那些事儿
博客等级 码龄6年 2万+粉丝 22原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值