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 触发拒绝策略 服务降级,需告警干预
相关推荐
aq55356009 分钟前
Spring Boot中的404错误:原因、影响及处理策略
java·spring boot·后端
mengqudoh14 分钟前
vue springboot mybatis实现自定义条件检索功能
vue.js·spring boot·mybatis
BUG?不,是彩蛋!19 分钟前
AI智慧社区--从0到1开发柱状图数据接口
java·spring boot·后端·intellij-idea·mybatis
BUG?不,是彩蛋!34 分钟前
从零到一掌握 K 线与技术指标:Java 实战教程 | MA, RSI, MACD 全解析
java·开发语言·spring boot·量化投资
计算机学姐1 小时前
基于SpringBoot的汽车美容保养系统
java·spring boot·后端·spring·tomcat·汽车·mybatis
爱吃山竹的大肚肚1 小时前
依赖冲突快速解决
java·spring boot·后端·spring cloud·maven
懒羊羊--搞点小技术1 小时前
EasyExcel自定义字段并且双表头导出实战
spring boot
yuyu_03041 小时前
Spring Boot在Windows开机自启动
windows·spring boot·后端
骇客野人1 小时前
Java springboot里注解大全和使用指南
java·开发语言·spring boot
用户8307196840821 小时前
Spring Boot 启动报错:OpenFeign 隐性循环依赖,排查了整整一下午
java·spring boot·spring cloud