实现异步最常用的方式@Async,快速上手

引言:

在Spring项目中实现异步的方式:

  • @Async
  • 消息队列
  • CompletableFuture
  • WebAsyncTask/DeferredResult
  • @Scheduled+@Async

最常用的就是@Async,这篇文章帮助你快速上手@Async以及正确使用这个注解;

1.简介:

@Async是Spring的注解,可以加在类或方法上。通俗的来讲,如果加上了这个注解,那么该类或者该方法在使用时将会进行异步处理,也就是创建一个线程来实现这个类或者方法,实现多线程。

2.使用:

1.需要在@SpringBootApplication启动类或者@configure注解类上 添加注解@EnableAsync启动多线程注解。

2.在需要异步执行的方法上添加@Async注解。

3.工作原理

1.Spring 启动时创建代理对象

  • Spring 扫描到 AsyncService 类中有 @Async 方法
  • 由于开启了 @EnableAsync,Spring 会为这个 Bean 创建一个 JDK 动态代理(或 CGLib 代理)
  • 最终注入到 TestController 中的 asyncService 不是原始对象,而是代理对象

2.调用 doSomething() 时,代理拦截

当你写:

实际执行的是 代理类的 doSomething() 方法,而不是你写的原始方法。

代理内部逻辑类似:

less 复制代码
    doSomething(); 
    if(方法有 @Async)
    // 1. 获取配置的TaskExecutor
    Executor executor = getAsyncExecutor(); 
    // 2. 把原方法包装成 Runnable 
    Runnable task = () -> originalObject.doSomething(); 
    // 3. 提交到线程池 → 异步执行
    executor.execute(task); 
    // 4.立即返回(如果是 void 方法)
    return
    

3:线程池中的工作线程执行任务

  • 线程池(如 ThreadPoolTaskExecutor)从队列取出任务
  • 在某个工作线程(比如 Async-1)中,真正执行你写的 doSomething() 方法体
  • 这个过程与主线程完全无关

4.线程池的选择和配置

1.Spring 会使用一个内置的默认线程池策略。这个"默认"其实不是真正的线程池,而是一个特殊实现:SimpleAsyncTaskExecutor

  • 每次调用 @Async 方法时,都会 创建一个全新的线程 来执行任务。
  • 执行完后线程直接销毁,不复用、不缓存、无队列。

风险:

  • 内存溢出(OOM)
  • CPU 上下文切换开销剧增 → 系统卡死
  • 无法控制并发度

2.自己配置线程池

1.配置

2.指定

5.注意事项:@Async失效的常见情况

  1. 未启用 @EnableAsync
  2. 方法不是 public
  3. 同类中的内部调
  4. 代理对象未生效(未经benan工厂管理,如new对象)
  5. 配置了错误的线程池或未正确初始化
  6. 异步方法定义在非 Spring 管理的类中
  7. 使用了CGLIB代理但方法是final(不可被代理)
  8. 与@Transactional冲突(都是代理对象实现的,可能冲突)

写在最后:想写的尽可能简洁,没想到还是有这么多,如果你能耐心看完,我觉得一定能帮助到你。

相关推荐
神奇的程序员3 小时前
从已损坏的备份中拯救数据
运维·后端·前端工程化
oden4 小时前
AI服务商切换太麻烦?一个AI Gateway搞定监控、缓存和故障转移(成本降40%)
后端·openai·api
李慕婉学姐5 小时前
【开题答辩过程】以《基于Android的出租车运行监测系统设计与实现》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
java·后端·vue
m0_740043735 小时前
SpringBoot05-配置文件-热加载/日志框架slf4j/接口文档工具Swagger/Knife4j
java·spring boot·后端·log4j
招风的黑耳6 小时前
我用SpringBoot撸了一个智慧水务监控平台
java·spring boot·后端
大佐不会说日语~6 小时前
Spring AI Alibaba 的 ChatClient 工具注册与 Function Calling 实践
人工智能·spring boot·python·spring·封装·spring ai
Miss_Chenzr6 小时前
Springboot优卖电商系统s7zmj(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·后端
期待のcode6 小时前
Springboot核心构建插件
java·spring boot·后端
2501_921649496 小时前
如何获取美股实时行情:Python 量化交易指南
开发语言·后端·python·websocket·金融
serendipity_hky7 小时前
【SpringCloud | 第5篇】Seata分布式事务
分布式·后端·spring·spring cloud·seata·openfeign