Spring Boot使用异步线程池

1、启用异步支持

在启动类或配置类上添加@EnableAsync注解,激活异步处理能力。

java 复制代码
@SpringBootApplication 
@EnableAsync 
public class Application {  
}

2、自定义线程池

java 复制代码
@Configuration 
public class AsyncConfig {
    @Bean("customExecutor")
    public TaskExecutor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);      // 核心线程数 
        executor.setMaxPoolSize(20);       // 最大线程数 
        executor.setQueueCapacity(100);    // 队列容量 
        executor.setThreadNamePrefix("Async-");  
        executor.setRejectedExecutionHandler(new  ThreadPoolExecutor.CallerRunsPolicy());
        executor.initialize(); 
        return executor;
    }
}

Spring Boot 2.1.0 之前的版本默认线程池:SimpleAsyncTaskExecutor。此线程池的特点是每次执行任务时都会新建线程(不重用线程),且不限制线程数量,高并发场景下可能导致资源耗尽。

Spring Boot 2.1.0 及更高版本默认线程池:ThreadPoolTaskExecutor。Spring Boot 在 TaskExecutionAutoConfiguration 中自动配置了一个默认线程池,核心参数为:核心线程数:8,最大线程数:Integer.MAX_VALUE,队列容量:Integer.MAX_VALUE,线程名前缀:task-,此线程池的 Bean 名称为 applicationTaskExecutor,在未自定义线程池时会优先使用它。

3、定义异步方法

在需要异步执行的方法上添加@Async,并确保该方法所属类被Spring管理(如使用@Service或@Component注解),使用时指定线程池名称。

java 复制代码
@Service 
public class AsyncService {
    @Async("customExecutor")
    public void sendSms() {
        // 异步执行逻辑 
    }
}

注意:禁止同类调用:异步方法不能在同一个类中通过内部方法调用,必须通过Spring代理对象调用(如通过@Autowired注入自身)。@Async仅对public方法生效。@Async不能修饰静态方法。异步类需避免循环依赖,否则可能导致代理失效。

任务提交阶段 活跃线程数 队列占用 线程池状态 关键现象
初始 10 任务 10 0/100 核心线程饱和 无队列堆积
累计 110 任务 10 100/100 队列满载,线程未扩容 任务开始延迟
累计 120 任务 20 100/100 线程池扩容至最大值 系统负载达到峰值
累计 121 任务 20 100/100 触发拒绝策略 服务降级,需告警干预
相关推荐
cjy0001114 分钟前
springboot的 nacos 配置获取不到导致启动失败及日志不输出问题
java·spring boot·后端
sheji34161 小时前
【开题答辩全过程】以 基于springboot的校园失物招领系统为例,包含答辩的问题和答案
java·spring boot·后端
程序员阿伦3 小时前
璋㈤鏈虹殑Java澶у巶闈㈣瘯璁帮細浠嶴pring Boot鍒癒ubernetes锛�3杞湡棰樺叏瑙f瀽锛�
spring boot·redis·kubernetes·aigc·java闈㈣瘯·寰湇鍔�·鐢靛晢绉掓潃
wuyikeer3 小时前
Spring BOOT 启动参数
java·spring boot·后端
zdl6864 小时前
springboot集成onlyoffice(部署+开发)
java·spring boot·后端
可观测性用观测云5 小时前
SpringBootAI 接入观测云 MCP 最佳实践
spring boot
BUG胡汉三5 小时前
自建在线文档编辑服务:基于 Collabora CODE + Spring Boot + Vue 3 的完整实现
vue.js·spring boot·后端·在线编辑
荒古前7 小时前
Spring Boot + MyBatis 启动报错:不允许有匹配 “[xX][mM][lL]“ 的处理指令目标
spring boot·后端·mybatis
mldlds7 小时前
Spring Boot 实战:轻松实现文件上传与下载功能
java·数据库·spring boot
xxjj998a7 小时前
Spring Boot 整合 Apollo 配置中心实战
java·spring boot·后端