专栏名称: Java基基
一个苦练基本功的 Java 公众号,所以取名 Java 基基
目录
相关文章推荐
生态梦网  ·  天津生二胎发钱?官方正式回应 ·  昨天  
CINNO  ·  荣耀MagicBook Pro ... ·  2 天前  
生态梦网  ·  重磅消息!天津拟放宽摇号指标 ·  2 天前  
51好读  ›  专栏  ›  Java基基

SpringBoot 中的异步处理机制详解

Java基基  · 公众号  ·  · 2025-02-12 14:25

正文

👉 这是一个或许对你有用 的社群

🐱 一对一交流/面试小册/简历优化/求职解惑,欢迎加入 芋道快速开发平台 知识星球。 下面是星球提供的部分资料:

👉 这是一个或许对你有用的开源项目

国产 Star 破 10w+ 的开源项目,前端包括管理后台 + 微信小程序,后端支持单体和微服务架构。

功能涵盖 RBAC 权限、SaaS 多租户、数据权限、 商城 、支付、工作流、大屏报表、微信公众号、 ERP CRM AI 大模型 等等功能:

  • Boot 多模块架构:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 微服务架构:https://gitee.com/zhijiantianya/yudao-cloud
  • 视频教程:https://doc.iocoder.cn
【国内首批】支持 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 双版本

来源:juejin.cn/post/
7424693750477848614


在现代 Web 应用程序开发中,处理并发任务和提高应用程序的性能是一个重要的主题。Spring Boot 提供了强大的异步处理机制,允许我们通过简单的配置实现多线程任务处理,避免阻塞主线程,从而提升应用的响应速度和吞吐量。本文将深入探讨 Spring Boot 中的异步处理机制,介绍其原理、配置方法以及实际使用场景。

1、为什么需要异步处理?

在 Web 应用程序中,某些任务可能需要花费较长的时间,比如调用外部服务、执行文件 I/O 操作或处理复杂的计算逻辑。如果这些任务在主线程(即请求处理线程)中执行,会导致响应变慢,影响用户体验。通过异步处理,我们可以将这些耗时任务交给后台线程执行,释放主线程,尽早返回响应。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

2、Spring Boot 异步处理的基本原理

Spring Boot 中的异步处理基于 Spring Framework 的 @Async 注解,它利用线程池来异步执行任务。通过简单地在方法上加上 @Async,Spring 会自动在后台线程中执行该方法,而不会阻塞主线程。

Spring 的异步支持核心依赖以下两个组件:

  • @EnableAsync:启用异步处理的注解。
  • @Async:标注需要异步执行的方法。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

3、Spring Boot 异步处理的配置

3.1. 启用异步支持

在使用异步功能之前,我们需要在 Spring Boot 应用的启动类或配置类中使用 @EnableAsync 注解启用异步支持:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class AsyncApplication {
    public static void main(String[] args) {
        SpringApplication.run(AsyncApplication.classargs);
    }
}

3.2. 创建异步方法

接下来,我们可以在服务层创建一个异步执行的方法。使用 @Async 注解标注的方法会在单独的线程中执行。

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncService {

    @Async
    public void executeAsyncTask() {
        System.out.println("执行异步任务: " + Thread.currentThread().getName());
        // 模拟长时间任务
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("任务完成");
    }
}

在该例子中, executeAsyncTask() 方法被标记为异步执行,当它被调用时,将不会阻塞调用者线程。

3.3. 调用异步方法

我们可以在控制器或服务中调用异步方法:

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AsyncController {

    private final AsyncService asyncService;

    public AsyncController(AsyncService asyncService) {
        this.asyncService = asyncService;
    }

    @GetMapping("/async")
    public String triggerAsyncTask() {
        asyncService.executeAsyncTask();
        return "异步任务已触发";
    }
}

当用户访问 /async 端点时,AsyncService 的异步任务会被触发,并立即返回响应,主线程不会等待异步任务的完成。

4、自定义线程池

默认情况下,Spring Boot 会使用一个简单的线程池来执行异步任务。但是在实际的生产环境中,我们通常需要对线程池进行更精细的配置。我们可以通过定义 Executor Bean 来自定义线程池。

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;

@Configuration
public class AsyncConfig {

    @Bean(name = "taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(25);
        executor.setThreadNamePrefix("Async-");
        executor.initialize();
        return executor;
    }
}

在这个配置中,我们创建了一个线程池 Executor,指定了核心线程数、最大线程数、队列容量等参数。线程池可以帮助我们更好地管理资源,避免大量并发任务导致系统资源耗尽。

为了让 Spring 使用这个自定义的线程池,我们需要在异步方法上指定线程池名称:

@Async("taskExecutor")
public void executeAsyncTask() {
    // 任务逻辑
}

5、异步方法的返回值

除了 void 类型,异步方法还可以返回 java.util.concurrent.Future org.springframework.util.concurrent.ListenableFuture ,允许我们在异步任务完成后获取其结果。

例如,返回 Future 类型的异步方法:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.Future;

@Async
public Future asyncMethodWithReturn() {
    try {
        Thread.sleep(3000






请到「今天看啥」查看全文