如何在Spring Boot中使用非池化虚拟线程执行异步任务
让Spring Boot的@Async直接使用虚拟线程的简洁方案
从Spring Boot 3.2版本开始,官方对Java 21的虚拟线程提供了原生简化支持,完全可以不用编写自定义的AsyncTaskExecutor Bean,就能让@Async注解默认使用虚拟线程执行异步任务,完美契合虚拟线程“轻量、用完即弃”的设计理念。
核心配置(无需编写Java配置类)
只需要在配置文件(application.properties或application.yml)中添加以下配置即可:
1. 让@Async默认使用虚拟线程
# application.properties spring.task.execution.virtual-threads.enabled=true
或者YAML格式:
# application.yml spring: task: execution: virtual-threads: enabled: true
开启该配置后,Spring Boot会自动将VirtualThreadTaskExecutor作为默认异步任务执行器,底层基于Executors.newVirtualThreadPerTaskExecutor()实现,无需维护传统线程池。
2. (可选)让Tomcat请求处理也使用虚拟线程
如果你的应用基于Tomcat容器,想要让请求处理线程替换为虚拟线程,同样只需添加一行配置:
# application.properties spring.tomcat.threads.virtual.enabled=true
或者YAML格式:
# application.yml spring: tomcat: threads: virtual: enabled: true
这会自动替换Tomcat的平台线程池为虚拟线程执行器,无需再编写TomcatProtocolHandlerCustomizer的Bean。
验证方式
在异步方法上直接标注@Async即可,无需指定执行器名称,方法会自动用虚拟线程执行:
@Service public class AsyncService { @Async public CompletableFuture<String> doAsyncTask() { // 任务逻辑 return CompletableFuture.completedFuture("任务完成"); } }
注意事项
- 必须使用Spring Boot 3.2及以上版本,同时JDK版本需为Java 21及以上。
- 如果需要区分部分异步任务用虚拟线程、部分用平台线程,可以给虚拟线程执行器指定名称,再在
@Async中指定:
之后在方法上使用@Bean(name = "virtualExecutor") public AsyncTaskExecutor virtualThreadExecutor() { return new VirtualThreadTaskExecutor(); }@Async("virtualExecutor")即可,但这种方式比配置文件全局开启繁琐,推荐优先使用配置文件方案。
内容的提问来源于stack exchange,提问作者liang li
相关产品推荐
相关产品推荐

