引言
2026年,Java 21早已成为主流,虚拟线程也从“预览”走向“正式”。
Spring Boot 4.0 默认支持虚拟线程,但你真的会用了吗?
本文带你用最少的配置,把 Spring Boot 项目改成虚拟线程模式,压测效果看得见。
一、为什么要用虚拟线程?
传统的 Java Web 服务,每个请求会占用一个 平台线程(OS 线程)。
平台线程创建成本高(1MB 左右的栈内存)
大量并发时,线程池打满 → 请求排队 → 响应变慢 → 甚至 OOM
虚拟线程(Virtual Thread,JEP 425/444)
创建成本极低(几 KB 内存)
数量可达百万级
阻塞时自动让出 CPU,适合 IO 密集型任务(数据库、RPC、文件操作)
一句话:你的 Spring Boot 项目如果有大量数据库查询 / HTTP 调用,换成虚拟线程,性能提升立竿见影。
二、环境要求
| 组件 | 版本要求 |
|---|---|
| jdk | JDK 21 及以上 |
| Spring Boot | 4.0.x |
| Tomcat | 10.1.x(Spring Boot 4 内置) |
如果你的项目还是 Spring Boot 2.x / 3.x,建议先升级到 4.0。
三、实战:为 Spring Boot 开启虚拟线程
3.1 新建 Spring Boot 4.0 项目
使用 Spring Initializr 或 IDEA 创建,选择:
Spring Web
Spring Boot 4.0.0(或更高)
3.2 核心配置:让 Tomcat 使用虚拟线程
Spring Boot 4.0 提供了非常简单的配置方式,在 application.yml 中:
server:
tomcat:
# 开启虚拟线程处理请求
threads:
virtual: true
没错,就这一行。
Spring Boot 4.0 会自动让 Tomcat 的请求处理线程池从平台线程切换到虚拟线程。
3.3 验证是否生效
写一个简单的测试接口:
@RestController
public class TestController {
@GetMapping("/thread")
public String threadInfo() {
return "处理线程: " + Thread.currentThread().toString();
}
}
启动项目,访问 /thread。
1.未开启虚拟线程:Thread[#41,http-nio-8080-exec-1,5,main]
2.开启虚拟线程:
VirtualThread[#42,…]/runnable@ForkJoinPool-1-worker-1
看到 VirtualThread 字样,说明配置成功。
四、进阶:让 @Async 也使用虚拟线程
很多业务里会有异步任务(发送邮件、记录日志、调用外部接口)。
你也可以让 Spring 的 @Async 跑在虚拟线程上。
4.1 配置虚拟线程任务执行器
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.task.AsyncTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.Executors;
@Configuration
public class VirtualThreadConfig {
@Bean
public AsyncTaskExecutor applicationTaskExecutor() {
// 使用虚拟线程作为执行器
var executor = new ThreadPoolTaskExecutor();
executor.setThreadFactory(Thread.ofVirtual().factory());
executor.initialize();
return executor;
}
}
4.2 使用 @Async
@Service
public class OrderService {
@Async
public CompletableFuture<String> sendNotification() {
// 模拟耗时操作
Thread.sleep(500);
return CompletableFuture.completedFuture("通知已发送");
}
}
此时 sendNotification() 会在虚拟线程中执行,不会阻塞主请求。
五、性能对比(实测)
测试场景
接口:查询数据库(模拟 50ms 延迟)
并发量:2000 个请求
压测工具:JMeter

吞吐量提升 3.5 倍,平均响应时间降低 70%。
如果你的接口里有更多 IO 等待(数据库、Redis、RPC),提升会更明显。
六、注意事项(重要)
6.1 不要池化虚拟线程
❌ 错误用法:
Executors.newFixedThreadPool(100, Thread.ofVirtual().factory());
6.2 避免 synchronized 块
synchronized 会固定虚拟线程(pin 到平台线程),导致性能下降。
✅ 改用 ReentrantLock 或 Semaphore。
6.3 本地变量 ThreadLocal
虚拟线程数量极多,如果用 ThreadLocal 存大对象,内存会爆炸。
尽量不用
或者使用 ScopedValue(Java 21 正式引入)
七、总结

Spring Boot 4.0 + Java 21 虚拟线程,已经是可以直接上生产的技术。
如果你的项目还在老版本,建议尽快规划升级,这是 2026 年 Java 后端的基本盘。
📌 本文代码已上传,可直接复制到你的项目中试用。
如果有帮助,欢迎点赞、收藏、转发。
449

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



