⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 网络 「网络」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注微信公众号:【芋道源码】有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
  4. 新的源码解析文章实时收到通知。每周更新一篇左右。
  5. 认真的源码交流微信群。

虚拟线程是 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中使用虚拟线程

在 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());
}

实验:传统线程 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)来管理资源,减少频繁的对象创建和销毁,提高内存使用效率。

小结

  1. 虚拟线程 是 Java 并发编程的革新,它简化了线程管理,提升了高并发场景下的性能。
  2. 使用虚拟线程,你可以轻松创建数十万甚至更多线程,而不会影响应用的性能。
  3. 在 Spring Boot 中配置虚拟线程非常简单,只需几行代码即可启用虚拟线程,带来显著的性能提升。
  4. 除了虚拟线程,其他优化技巧(如并行流、异步编程、数据库查询优化等)也能有效提升 Java 应用的性能。

通过这些技巧,Spring Boot 应用能够在高并发场景下表现出更强的性能和更低的响应延迟。

文章目录
  1. 1. 虚拟线程的基础用法
  2. 2. 在Spring Boot中使用虚拟线程
  3. 3. 实验:传统线程 vs 虚拟线程
    1. 3.1. 1. 创建100,000个线程并执行
    2. 3.2. 2. HTTP 请求性能对比
  4. 4. Java性能提升的其他技巧
  5. 5. 小结