网站Logo 苏叶的belog

Spring异步线程

wdadwa
4
2026-02-27

Spring 提供了开箱即用的异步支持:

  • @EnableAsync:开启异步线程
  • @Async:标记异步方法

一,开启异步功能

@Configuration
@EnableAsync
public class AsyncConfig {
}

@EnableAsync 会导入:

AsyncConfigurationSelector

最终注册一个关键 Bean:

AsyncAnnotationBeanPostProcessor

这个类负责:扫描 @Async 方法 → 创建代理 → 替换原 Bean

二,写一个异步方法

@Service
public class OrderService {

    @Async
    public void createOrder() {
        System.out.println(Thread.currentThread().getName());
    }
}

调用:

orderService.createOrder();

输出:

task-1

说明已经切到线程池。

三,配置异步线程池

3.1 默认线程池

如果你不配置线程池:

Spring 会使用:SimpleAsyncTaskExecutor

  • 这不是线程池!!!

它的特点:

  • 每次都 new 一个线程
  • 不复用线程
  • 不限数量

生产环境绝对不能用。

3.2 配置线程池

应该自己配置 ThreadPoolTaskExecutor

@Configuration
@EnableAsync
public class AsyncConfig {

    @Bean("myExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

        executor.setCorePoolSize(5);        // 核心线程
        executor.setMaxPoolSize(10);        // 最大线程
        executor.setQueueCapacity(100);     // 队列大小
        executor.setKeepAliveSeconds(60);   // 空闲时间
        executor.setThreadNamePrefix("async-");

        executor.initialize();
        return executor;
    }
}

使用:

@Async("myExecutor")
public void createOrder() {
}

四,返回值

4.1 无返回值

@Async
public void sendEmail() {
}

异常不会抛到调用方!

4.2 有返回值

有返回值则,必须返回:

Future
CompletableFuture
ListenableFuture

推荐:

@Async
public CompletableFuture<String> test() {
    return CompletableFuture.completedFuture("ok");
}

五,底层原理

核心组件:AsyncAnnotationBeanPostProcessor

执行流程:

Bean 创建
    ↓
发现 @Async
    ↓
创建代理对象
    ↓
方法调用时
    ↓
AsyncExecutionInterceptor
    ↓
提交到线程池

本质是:AOP + 线程池

六,SpringBoot 自动配置

在 Spring Boot 中:

自动装配类:TaskExecutionAutoConfiguration

默认 Bean 名称:applicationTaskExecutor

可在 application.yml 配置:

spring:
  task:
    execution:
      pool:
        core-size: 5
        max-size: 10
        queue-capacity: 100
动物装饰