SpringBoot中实现异步的六种方式

 更新时间:2026年03月10日 09:45:37   作者:彭于晏Yan  
在SpringBoot开发中,合理运用多线程技术能显著提升系统吞吐量与响应速度,本文总结了6种在SpringBoot中实现多线程的技术方式,包括注解式异步、显式线程池、CompletableFuture、事件监听、JDK原生线程池和异步定时任务,每种方式都有其适用场景,需要的朋友可以参考下

在Spring Boot开发中,合理运用多线程技术能显著提升系统吞吐量与响应速度。

本文梳理了 6 种落地性极强的多线程实现方式,覆盖从「简单注解式异步」到「复杂多任务编排」的全场景,结合不同业务场景(高并发、系统解耦、周期性任务)和技术诉求(开发效率、精细控制、可观测性),可灵活选型;同时补充生产级避坑指南、线程池调优策略和监控方案,确保异步方案不仅 “能用”,更能 “稳定用、高效用”

1. @Async注解(开发首选)

基于AOP动态代理机制,实现方法级别的异步执行,无需手动管理线程生命周期。

特点:

  • 低侵入性,仅需注解即可实现异步,开发效率极高;
  • 必须配合自定义线程池使用,避免默认SimpleAsyncTaskExecutor(无复用,性能差);

适用场景:日志记录、邮件发送、短信通知等简单异步任务。

配置自定义线程池并开启异步支持:

@Configuration
@EnableAsync // 开启Spring异步支持
public class AsyncConfig {
    /**
     * 自定义异步线程池配置
     * @return 线程池执行器
     */
    @Bean("taskExecutor") // 自定义线程池名称,便于指定使用
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(4); // 核心线程数,默认建议设置为CPU核心数
        executor.setMaxPoolSize(8); // 最大线程数,建议为核心线程数的2倍,应对突发高并发
        executor.setQueueCapacity(100); // 任务队列容量,缓冲待执行任务
        executor.setThreadNamePrefix("Async-"); // 线程名称前缀,便于日志排查
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); // 拒绝策略:主线程执行
        executor.initialize(); // 初始化线程池
        return executor;
    }
}
  • 在业务方法上标注异步注解:
@Service
public class DemoService {

    @Async("taskExecutor") // 指定使用自定义的线程池
    public void sendEmail(String email) {
        System.out.println("线程:" + Thread.currentThread().getName() + "消息ID:" +" 正在发送邮件至:" + email);
    }
}

2. 显式使用线程池(精细控制)

  • 直接注入自定义ThreadPoolTaskExecutor,手动提交任务执行,完全掌控线程生命周期。
  • 适用场景:高并发数据处理、大批量文件解析、复杂计算任务等需要精细控制线程参数的场景。
@Service
public class DemoService {

    // 注入自定义线程池(对应AsyncConfig中配置的bean)
    @Resource(name = "taskExecutor")
    private ThreadPoolTaskExecutor executor;

    /**
     * 异步生成业务报表
     */
    public void generateReport() {
        for (int i = 0; i < 50; i++) {
            // 提交异步任务到线程池
            executor.execute(() -> {
                System.out.println("线程:" + Thread.currentThread().getName() + " 正在生成报表");
                // 报表生成核心逻辑(数据查询、计算、导出等)
            });
        }
    }
}

3. CompletableFuture(多任务编排)

  • 支持多异步任务的组合、串行、并行执行,可便捷处理任务执行结果,适配复杂业务流。
  • CompletableFuture 默认使用ForkJoinPool.commonPool(),该线程池是全局共享的,高并发下易被占满,建议指定自定义线程池
  • 适用场景:下单流程(库存+余额+物流校验)、数据聚合(多接口并行查询)等需组合多个异步操作的复杂业务流。
@Service
public class DemoService {
    
    @Resource(name = "taskExecutor")
	private ThreadPoolTaskExecutor executor;

    /**
     * 异步检查库存
     * @return 库存是否充足(Future结果)
     */
    public CompletableFuture<Boolean> checkInventory() {
        // 异步执行库存检查逻辑
        return CompletableFuture.supplyAsync(() -> {
            System.out.println("线程:" + Thread.currentThread().getName() + " 检查库存");
            return true; // 模拟库存充足
        },executor);
    }

    /**
     * 异步扣减余额
     * @return 余额扣减是否成功(Future结果)
     */
    public CompletableFuture<Boolean> deductBalance() {
        return CompletableFuture.supplyAsync(() -> {
            System.out.println("线程:" + Thread.currentThread().getName() + " 扣减余额");
            return true; // 模拟扣减成功
        },executor);
    }

    /**
     * 下单核心逻辑:并行执行库存检查+余额扣减,完成后执行后续操作
     */
    public void placeOrder() {
        // 并行执行多个异步任务
        CompletableFuture.allOf(checkInventory(), deductBalance())
                .thenRun(() -> { // 所有任务完成后执行
                    System.out.println("线程:" + Thread.currentThread().getName() + " 所有前置校验完成,开始创建订单");
                    // 订单创建核心逻辑
                });
    }
}

4. 事件监听+@Async(系统解耦)

  • 基于Spring事件发布/订阅机制,将业务逻辑解耦为“事件发布”和“事件处理”,结合@Async实现异步处理。
  • 适用场景:系统解耦场景(如订单创建后,异步触发物流通知、积分发放、数据统计等)。
  • 定义自定义事件:
/**
 * 订单创建事件
 */
public class OrderCreatedEvent extends ApplicationEvent {
    private Long orderId; // 订单ID

    /**
     * 构造函数
     * @param source 事件源(当前发布事件的对象)
     * @param orderId 订单ID
     */
    public OrderCreatedEvent(Object source, Long orderId) {
        super(source);
        this.orderId = orderId;
    }

    // getter
    public Long getOrderId() {
        return orderId;
    }
}
  • 发布事件:
@Service
public class DemoService {

    // 注入Spring事件发布器
    @Resource
    private ApplicationEventPublisher publisher;

    /**
     * 创建订单(核心逻辑)
     */
    public void createOrder() {
        // 1. 执行创建订单的核心逻辑
        Long orderId = 123L; // 模拟生成订单ID
        System.out.println("主线程:创建订单,订单ID:" + orderId);

        // 2. 发布订单创建事件
        publisher.publishEvent(new OrderCreatedEvent(this, orderId));
    }
}
  • 异步监听并处理事件:
@Component
public class OrderListener {
    /**
     * 异步处理订单创建事件
     * @param event 订单创建事件
     */
    @Async("taskExecutor") // 异步处理,指定自定义线程池
    @EventListener // 监听OrderCreatedEvent事件
    public void handleOrderCreatedEvent(OrderCreatedEvent event) {
        Long orderId = event.getOrderId();
        System.out.println("线程:" + Thread.currentThread().getName() + " 处理订单事件,订单ID:" + orderId);
        // 事件处理逻辑(如:发送订单通知、更新库存、记录日志等)
    }
}

5. JDK原生线程池(轻量使用)

  • 简单并发任务、临时性多线程需求(无需Spring容器管理线程池的场景)。
@Service
public class DemoService {

    // 创建固定大小的JDK原生线程池(10个核心线程)
    private ExecutorService executor1 = Executors.newFixedThreadPool(10, r -> {
        Thread thread = new Thread(r);
        thread.setName("JdkAsync-"); // 线程名称前缀
        return thread;
    });

    /**
     * 异步处理数据
     */
    public void processData() {
        // 提交任务到线程池执行
        executor1.submit(() -> {
            System.out.println("线程:" + Thread.currentThread().getName() + " 正在处理数据");
            // 数据处理核心逻辑
        });
    }
}

6. 异步定时任务(周期性处理)

  • 结合定时任务与异步执行,避免定时任务阻塞主线程,适合周期性数据处理、定时清理、定时同步等场景。
@Configuration
@EnableAsync // 开启异步支持
@EnableScheduling // 开启定时任务支持
public class ScheduledConfig {
    /**
     * 异步定时执行报表统计任务
     * fixedRate = 5000:每隔5秒执行一次(从上一次执行开始计时)
     */
    @Async("taskExecutor") // 异步执行,指定自定义线程池
    @Scheduled(fixedRate = 5000)
    public void reportJob() {
        System.out.println("线程:" + Thread.currentThread().getName() + " 执行定时报表统计,时间:" + System.currentTimeMillis());
        // 周期性数据处理逻辑(如:统计昨日订单、清理无效数据、同步第三方数据等)
    }
}

总结

实现方式适用场景复杂度开发效率性能风险点
@Async 注解简单异步任务(邮件、日志)注解失效、异常未捕获
显式线程池高并发数据处理、精细线程控制线程池参数不合理导致 OOM
CompletableFuture多任务编排、复杂业务流默认线程池共享导致阻塞
事件监听 +@Async系统解耦、多异步操作触发事件丢失、重复消费
JDK 原生线程池简单并发、临时性任务未优雅关闭导致任务丢失
异步定时任务周期性数据处理定时任务堆积、执行时间重叠

实践建议:

  • 通过合理选型,Spring Boot应用的吞吐量可提升3-10倍。
  • 生产环境优先选择**@Async + 自定义线程池**的组合方案:既保证开发效率,又能通过线程池参数控制避免资源耗尽;
  • 复杂业务流(如下单、支付)建议使用CompletableFuture做任务编排;
  • 系统解耦场景优先采用事件监听+@Async,降低模块间耦合度。

以上就是SpringBoot中实现异步的六种方式的详细内容,更多关于SpringBoot异步实现方式的资料请关注脚本之家其它相关文章!

相关文章

  • 在IDEA中配置Selenium和WebDriver的具体操作

    在IDEA中配置Selenium和WebDriver的具体操作

    在自动化测试领域Selenium是一款非常流行的开源工具,它支持多种浏览器,并提供了丰富的API供开发者使用,而WebDriver则是Selenium的一个重要组件,它负责驱动浏览器执行测试脚本,这篇文章主要给大家介绍了在IDEA中配置Selenium和WebDriver的具体操作,需要的朋友可以参考下
    2024-10-10
  • Java中list根据id获取对象的几种方式

    Java中list根据id获取对象的几种方式

    这篇文章主要给大家介绍了关于Java中list根据id获取对象的几种方式,文中通过实例代码介绍的非常详细,对大家学习或者使用java具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • Java中Lambda表达式的使用详细教程

    Java中Lambda表达式的使用详细教程

    这篇文章将通过示例为大家详细展示Java中Lambda表达式的用法,同时也会介绍Lambda的相关知识,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-05-05
  • springboot2.5.6集成RabbitMq实现Topic主题模式(推荐)

    springboot2.5.6集成RabbitMq实现Topic主题模式(推荐)

    这篇文章主要介绍了springboot2.5.6集成RabbitMq实现Topic主题模式(推荐),pom.xml引入依赖和常量类创建,本文通过实例代码给大家介绍的非常详细,需要的朋友参考下吧
    2021-11-11
  • Spring Boot2.3 新特性分层JAR的使用

    Spring Boot2.3 新特性分层JAR的使用

    这篇文章主要介绍了Spring Boot2.3 新特性分层JAR的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • java实现线上环境远程debug调试过程

    java实现线上环境远程debug调试过程

    本文介绍了在Docker容器中配置Tomcat和Spring Boot进行远程调试的方法,通过配置`CATALINA_OPTS`或`JPDA`参数,可以在测试环境中启动Tomcat或Spring Boot应用的debug模式,然后在本地IDEA中设置断点进行调试,从而更高效地定位和解决问题
    2025-02-02
  • 详解如何在Java中创建Excel迷你图

    详解如何在Java中创建Excel迷你图

    迷你图是一种简洁而有效的数据可视化方式,常用于展示趋势和变化,通常被用于数据仪表盘、报告和展示中,以便在有限的空间内展示多个数据集的趋势,今天小编为大家介绍如何在Java中创建Excel迷你图,需要的朋友可以参考下
    2023-10-10
  • Spring中Bean扫描原理详情

    Spring中Bean扫描原理详情

    这篇文章主要介绍了Spring中Bean扫描原理详情,文章为荣啊主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07
  • 简单了解JavaBean作用及常用操作

    简单了解JavaBean作用及常用操作

    这篇文章主要介绍了简单了解JavaBean作用及常用操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-05-05
  • Spring Security使用数据库登录认证授权

    Spring Security使用数据库登录认证授权

    本文主要介绍了Spring Security使用数据库登录认证授权,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-01-01

最新评论