You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 19:12:58