Spring Boot 通过虚拟线程提升并发吞吐量,需JDK 21+和Spring Boot 3.2+/4.0+,配置server.tomcat.threads.virtual.true或spring.threads.virtual.enabled=true启用Web层虚拟线程,并自定义taskExecutor Bean支持@Async异步任务。

Spring Boot 中配置虚拟线程提升并发吞吐量,关键在于让 Web 请求处理和异步任务都运行在虚拟线程上。它不依赖改写业务代码,而是通过轻量级线程替换传统平台线程,特别适合数据库查询、HTTP 调用、文件读写等 I/O 密集型场景。
确认运行环境是否达标
虚拟线程是 JDK 21 正式特性,Spring Boot 需要对应版本支持:
- JDK 版本:必须为 JDK 21 或更高版本(启动时无需加
--enable-preview,JDK 21+ 已默认启用) - Spring Boot 版本:推荐使用 3.2.x 或 4.0.x(3.2 开始原生支持,4.0 对 Tomcat 虚拟线程集成更简洁)
- Web 容器:Spring Boot 3.2+ 默认内嵌 Tomcat 10.1+,已兼容虚拟线程;若用 Jetty 或 Undertow,需自行适配执行器
开启 Web 层虚拟线程处理请求
这是最直接的吞吐量提升方式,让每个 HTTP 请求由虚拟线程处理,避免线程池打满排队:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- Spring Boot 4.0:在
application.yml中添加一行即可
tomcat:
threads:
virtual: true
- Spring Boot 3.2:使用通用配置方式(更灵活,兼容其他容器)
threads:
virtual:
enabled: true
- 验证是否生效:调用一个返回当前线程信息的接口,响应中出现
VirtualThread[#xx, ...]即表示成功
让 @Async 异步任务也跑在虚拟线程上
日志记录、消息发送、第三方 API 调用等后台任务,同样可受益于虚拟线程的低开销:
- 定义一个基于虚拟线程的
TaskExecutorBean
public TaskExecutor taskExecutor() {
return new TaskExecutorAdapter(
Executors.newVirtualThreadPerTaskExecutor()
);
}
- 确保该 Bean 名为
taskExecutor,Spring 会自动将其用于@Async方法 - 如需命名或定制(如设置线程名前缀),可用
Thread.ofVirtual().name("async-").factory()构造
注意事项与适用边界
虚拟线程不是万能加速器,合理使用才能发挥价值:
- 适合场景:大量阻塞 I/O(JDBC 查询、RestTemplate/Feign 调用、Redis 操作、文件上传下载)
- 慎用场景:纯 CPU 计算(如密集数学运算、大对象序列化)、长时间持有锁、调用未适配虚拟线程的 native 代码
-
监控建议:开启
management.endpoints.web.exposure.include=metrics,关注jvm.threads.live和thread.virtual.*指标 - 线程安全不变:虚拟线程仍遵循 Java 内存模型,共享变量仍需同步,不能因“线程多”而忽略并发控制

















