spring boot异步任务需三步:启用@enableasync、定义threadpooltaskexecutor bean(设core/maxpoolsize、queuecapacity、threadnameprefix及拒绝策略)、@async方法须public且跨类调用;推荐按io/cpu密集型分线程池,并用completablefuture或重写异常处理器捕获异常。

Spring Boot 实现异步线程池任务处理,核心是三件事:开启异步支持、定义可复用的线程池、把耗时逻辑交给它执行。默认的 @Async 用的是无队列、不复用线程的简易执行器,生产环境必须替换为可控的 ThreadPoolTaskExecutor。
启用异步并声明线程池 Bean
在配置类或启动类上加 @EnableAsync,再提供一个 Executor 类型的 Bean(推荐实现 AsyncConfigurer 接口,更规范):
- 必须用
@Bean方法返回ThreadPoolTaskExecutor实例,不能只 new 一个对象 - 设置
corePoolSize(如 8~10)、maxPoolSize(如 30~50)、queueCapacity(建议 50~200,避免无限堆积) - 指定
threadNamePrefix,方便日志排查;设setRejectedExecutionHandler(比如CallerRunsPolicy)防止任务被静默丢弃
@Async 方法的写法和限制
标注 @Async 的方法会被代理到线程池中执行,但有硬性约束:
- 方法必须是
public,且不能是private或protected - 不能在同一个类里调用本类的
@Async方法(AOP 代理失效,会退化为同步) - 返回值只能是
void、Future<t></t>、CompletableFuture<t></t>,不能直接返回String或User
按业务类型区分线程池(进阶建议)
不同任务对资源的需求不同,混用一个线程池容易相互拖累:
- IO 密集型(如发邮件、调第三方 API):可设较高
corePoolSize(15~30),配合中等队列 - CPU 密集型(如批量计算、图像处理):
corePoolSize建议设为 CPU 核心数 ±1,避免上下文频繁切换 - 可通过
@Async("ioTaskExecutor")指定使用哪个命名 Bean,需确保该 Bean 已声明
异常处理不能靠 try-catch
@Async 方法抛出的异常不会传播到调用方,主线程感知不到:
- 若返回
CompletableFuture,可用whenComplete或exceptionally捕获 - 若返回
void,需重写getAsyncUncaughtExceptionHandler方法统一处理未捕获异常 - 不要依赖 Controller 层的全局异常处理器来捕获异步方法里的异常











