专栏名称: Java基基
一个苦练基本功的 Java 公众号,所以取名 Java 基基
目录
相关文章推荐
人生研究所  ·  89元秒!红豆旗下竺纱棉四件套,A类婴儿级, ... ·  12 小时前  
新闻广角  ·  国家统计局:2024年GDP同比增长5%,人 ... ·  18 小时前  
新闻广角  ·  普京:俄罗斯与美国准备建立合作关系 ·  昨天  
学习曾国藩  ·  一个人最掉价的8种行为,希望你一个都没有! ·  3 天前  
51好读  ›  专栏  ›  Java基基

Spring Boot 性能提升的核武器,速度提升 500%!

Java基基  · 公众号  ·  · 2025-01-23 11:55

正文

👉 这是一个或许对你有用 的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入 芋道快速开发平台 知识星球。 下面是星球提供的部分资料:

👉 这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、 商城 、支付、工作流、大屏报表、微信公众号、 ERP CRM AI 大模型 等等功能:

  • Boot 仓库:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 仓库:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 21 + SpringBoot 3.2.2、JDK 8 + Spring Boot 2.7.18 双版本

来源:网络


虚拟线程是 Java 21 引入的一个新特性,用于简化并发编程。它与传统的操作系统线程相比,具有显著的优势:

  1. 轻量级: 虚拟线程由 JVM 管理,而非操作系统,因此它们的内存占用和创建成本远低于传统线程。理论上,你可以轻松创建数十万甚至更多的虚拟线程。
  2. 高并发性: 虚拟线程能处理更高并发的场景,特别是 I/O 密集型的应用,适合开发高并发、响应式的应用程序。
  3. 自动管理: 无需手动管理线程池,JVM 会根据负载自动调整虚拟线程的调度,简化了并发编程的复杂性。

虚拟线程的基础用法

创建虚拟线程非常简单。你可以像创建传统线程一样启动虚拟线程,但它的创建与启动更加轻量:

Thread virtualThread = Thread.ofVirtual().start(() -> {  
    System.out.println("虚拟线程正在运行");  
});  
System.out.println("主线程正在运行");  

虚拟线程的延迟启动:

Thread virtualThread = Thread.ofVirtual()  
    .name("虚拟线程")  
    .unstarted(() -> System.out.println("虚拟线程运行中"));  
  
virtualThread.start();  
virtualThread.join(); // 等待虚拟线程完成  

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

在Spring Boot中使用虚拟线程

在 Spring Boot 项目中使用虚拟线程需要一些简单的配置:

确保 Java 版本为 21 或以上。

1.在 pom.xml 中启用 --enable-preview ,以便支持虚拟线程特性。

<plugin>  
    <groupId>org.apache.maven.pluginsgroupId>  
    <artifactId>maven-compiler-pluginartifactId>  
    <configuration>  
        <source>21source>  
        <target>21target>  
        <compilerArgs>  
            <arg>--enable-previewarg>  
        compilerArgs>  
    configuration>  
plugin>  

2.在 application.properties 中启用性能监控工具:

management.endpoints.web.exposure.include=health,info,metrics  

3.在 Spring Boot 中为 Tomcat 配置虚拟线程执行器:

@Bean  
public TomcatProtocolHandlerCustomizer> protocolHandlerVirtualThreadExecutorCustomizer() {  
    return protocolHandler -> protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());  
}  

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

实验:传统线程 vs 虚拟线程

1. 创建100,000个线程并执行

传统线程:

for (int i = 0; i 100_000; i++) {  
    Thread thread = new Thread(() -> System.out.println(i));  
    thread.start();  
    thread.join();  
}  

执行耗时约 18.6 秒。

虚拟线程:

for (int i = 0; i 100_000; i++) {  
    Thread thread = Thread.ofVirtual().unstarted(() -> System.out.println(i));  
    thread.start();  
    thread.join();  
}  

执行耗时仅 3.7 秒,性能提升了近 500% 。

2. HTTP 请求性能对比

在高并发场景下,虚拟线程的优势尤为明显。我们对比了传统线程与虚拟线程在处理 HTTP 请求时的表现。

配置 HTTP 线程执行器:

@Bean  
public TomcatProtocolHandlerCustomizer> protocolHandlerVirtualThreadExecutorCustomizer() {  
    return protocolHandler -> protocolHandler.setExecutor(Executors.newVirtualThreadPerTaskExecutor());  
}  

请求测试:发送 1600 个 HTTP 请求,400 并发。

1.传统线程:

  • 请求耗时:9.659 秒
  • 每秒请求数:165.65

2.虚拟线程:

  • 请求耗时:7.912 秒
  • 每秒请求数:202.22

虚拟线程的吞吐量大幅提升,响应时间显著缩短。

Java性能提升的其他技巧

除了虚拟线程,Java 还有一些其他的性能提升技巧,尤其适用于 Spring Boot 高并发场景:

1.使用并行流: 对于 CPU 密集型任务,可以使用并行流( parallelStream() )来利用多核 CPU,提高处理速度。







请到「今天看啥」查看全文