👉 这是一个或许对你有用的社群
🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入「芋道快速开发平台」知识星球。下面是星球提供的部分资料:
《项目实战(视频)》:从书中学,往事上“练”
《互联网高频面试题》:面朝简历学习,春暖花开
《架构 x 系统设计》:摧枯拉朽,掌控面试高频场景题
《精进 Java 学习指南》:系统学习,互联网主流技术栈
《必读 Java 源码专栏》:知其然,知其所以然

👉这是一个或许对你有用的开源项目
国产 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 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 双版本
虚拟线程是 Java 21 引入的一个新特性,用于简化并发编程。它与传统的操作系统线程相比,具有显著的优势:
轻量级: 虚拟线程由 JVM 管理,而非操作系统,因此它们的内存占用和创建成本远低于传统线程。理论上,你可以轻松创建数十万甚至更多的虚拟线程。
高并发性: 虚拟线程能处理更高并发的场景,特别是 I/O 密集型的应用,适合开发高并发、响应式的应用程序。
自动管理: 无需手动管理线程池,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.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>21</source>
<target>21</target>
<compilerArgs>
<arg>--enable-preview</arg>
</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,提高处理速度。
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
numbers.parallelStream().forEach(number -> {
System.out.println(number * 2);
});
2.异步编程与CompletableFuture: 对于 I/O 密集型任务,可以使用 CompletableFuture 进行异步处理,减少线程阻塞,提高响应性能。
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
// 异步执行任务
System.out.println("异步任务完成");
});
future.join(); // 等待任务完成
3.优化数据库查询: 减少数据库查询的次数,使用缓存(如 Redis)来存储频繁查询的数据,减少不必要的 I/O 操作。
4.内存管理优化: 通过使用对象池(如 Apache Commons Pool)来管理资源,减少频繁的对象创建和销毁,提高内存使用效率。
小结
虚拟线程 是 Java 并发编程的革新,它简化了线程管理,提升了高并发场景下的性能。
使用虚拟线程,你可以轻松创建数十万甚至更多线程,而不会影响应用的性能。
在 Spring Boot 中配置虚拟线程非常简单,只需几行代码即可启用虚拟线程,带来显著的性能提升。
除了虚拟线程,其他优化技巧(如并行流、异步编程、数据库查询优化等)也能有效提升 Java 应用的性能。
通过这些技巧,Spring Boot 应用能够在高并发场景下表现出更强的性能和更低的响应延迟。
欢迎加入我的知识星球,全面提升技术能力。
👉 加入方式,“长按”或“扫描”下方二维码噢:

星球的内容包括:项目实战、面试招聘、源码解析、学习路线。





文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
975

被折叠的 条评论
为什么被折叠?



