​@Async​

Spring框架中的 ​@Async​注解是为了支持异步方法调用而设计的。

异步方法调用是指调用方在发起方法调用后,不需要等待被调用方法的结果返回,而是可以立即继续执行其他任务。这种方式能够提高系统的并发性和响应性,特别适用于一些耗时较长、不需要立即获取结果的操作。

Spring引入了 ​@Async​注解来实现异步方法调用。使用 ​@Async​注解修饰的方法会在执行时自动开启一个新的线程,使得方法可以异步执行。同时,Spring还提供了与 ​@Async​注解配套使用的任务执行器(TaskExecutor)来管理线程池,以便更好地控制异步任务的并发度和资源消耗。

@Async​注解的原理如下:

  1. Spring使用AOP(面向切面编程)技术对被 ​@Async​注解修饰的方法进行代理。
  2. 在运行时,当调用带有 ​@Async​注解的方法时,实际上是调用了代理对象的方法。
  3. 代理对象会将目标方法的调用包装在一个 ​Future​对象中,并立即返回给调用方,不阻塞主线程。
  4. 代理对象使用设定的任务执行器(TaskExecutor)来执行异步任务,将实际的方法调用放在一个新的线程中进行。
  5. 当异步任务执行完毕后,会将结果封装在 ​Future​对象中,并提供给调用方获取。

在Spring源码中,​@Async​注解的实现主要依赖于两个核心组件:​AsyncAnnotationBeanPostProcessor​和 ​TaskExecutor​。

  1. ​AsyncAnnotationBeanPostProcessor​:它是一个Bean后置处理器,负责解析并处理带有 ​@Async​注解的方法。在Spring容器初始化时,它会扫描所有的Bean定义,找到所有具有 ​@Async​注解的方法,并对其进行代理。它使用了Spring的AOP功能,通过创建代理对象来拦截异步方法的调用。

  2. ​TaskExecutor​:它是任务执行器,用于管理执行异步任务的线程池。Spring提供了多种内置的任务执行器实现,如 ​SimpleAsyncTaskExecutor​、​ThreadPoolTaskExecutor​等。开发人员可以根据需要选择适合自己应用场景的任务执行器。

下面以一个简单的例子来说明 ​@Async​注解的使用和原理:

@Service
public class MyService {
    
    @Async
    public void performAsyncTask() {
        // 异步执行的任务代码
    }
}

 在上述示例中,​MyService​类中的 ​performAsyncTask​方法被 ​@Async​注解修饰,表示该方法将以异步方式执行。

当应用程序启动时,​AsyncAnnotationBeanPostProcessor​会被Spring容器识别为一个Bean后置处理器,并被自动应用于所有的Bean。

当调用 ​MyService​的 ​performAsyncTask​方法时,实际上是通过代理对象进行调用。代理对象会将方法包装在一个 ​Future​对象中,并立即返回给调用方。同时,代理对象会将实际的方法调用提交给配置好的任务执行器。

任务执行器根据配置的线程池策略,从线程池中获取一个空闲的线程来执行异步任务。异步任务执行完毕后,将结果封装在 ​Future​对象中,以供调用方获取。

​@Async​注解的原理和执行流程:

  1. 在应用程序启动时,Spring容器会扫描所有的Bean定义,包括带有 ​@Async​注解的方法。

  2. 当包含 ​@Async​注解的方法被调用时,实际上是通过动态代理机制来进行方法的拦截和处理。

  3. 在调用带有 ​@Async​注解的方法时,代理对象会将方法的实现包装在一个 ​AsyncExecutionInterceptor​对象中,并立即返回给调用方,不阻塞主线程。

  4. ​AsyncExecutionInterceptor​是 ​AsyncAnnotationAdvisor​的内部类,在方法调用前后进行拦截并执行特定的逻辑。

  5. 当被拦截的方法需要执行时,代理对象将其提交给配置好的 ​TaskExecutor​来执行异步任务。​TaskExecutor​负责创建新线程或从线程池中获取空闲的线程来执行方法。

  6. 异步任务完成后,会将结果封装在一个 ​Future​对象中,并通过回调机制通知调用方。

通过动态代理技术,​@Async​注解使得异步方法的调用变得非常简单。当使用 ​@Async​注解标记的方法被调用时,实际上是通过代理对象来执行。代理对象会将异步任务提交给配置好的 ​TaskExecutor​来执行,不阻塞主线程。一旦异步任务完成,将结果封装在 ​Future​对象中,以供调用方获取。整个过程中,Spring利用了AOP和动态代理的机制,使得异步方法的实现变得更加灵活和高效。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/87862.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

npm install 安装依赖,报错 Host key verification failed

设置 git 的身份和邮箱 git config --global user.name "你的名字" > 用户名 git config --global user.email “你的邮箱" > 邮箱进入 > 用户 > [你的用户名] > .ssh文件夹下,删除 known_hosts 文件即可 进入之后有可能会看到 known_hosts…

css实现文字的渐变,适合大屏

1 在全局写一个全局样式,文字渐变 2 在组件中使用 CSS3利用-webkit-background-clip: text;实现文字渐变效果_css如何把盒子底部的文字变成透明渐变_I俩月亮的博客-CSDN博客 CSS 如何实现文字渐变色 ?_css字体颜色渐变_一个水瓶座程序猿.的博客-CSDN博客…

docker 安装 redis

目录 1、下载镜像文件 2、创建实例并启动 3、使用 redis 镜像执行 redis-cli 命令连接 4、redis持久化操作 5、然后按照第3点,再试一试,看看redis持久化是否配置成功。 6、最后与redis可视化工具测试连接 大家先 su root,这让输入命令就…

goland 中的调试器 -- Evaluate

今天一个好朋友 找到我,问我关于goland中Evaluate 小计算器的使用方式,说实话,我在此之前也没用过这个东西,然后我就找一些相关文档,但是这类文档少的可怜,所以我就稍微研究一下,找找材料&#…

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】

【QT5-自我学习-线程qThread移植与使用-通过代码完成自己需要功能-移植小记3】 1、前言2、实验环境3、自我总结(1)文件的编写(2)信号与槽的新理解(3)线程数据的传递 4、移植步骤第一步:添加新文…

华为云Stack的学习(一)

一、华为云Stack架构 1.HCS 物理分散、逻辑统一、业务驱动、运管协同、业务感知 2.华为云Stack的特点 可靠性 包括整体可靠性、数据可靠性和单一设备可靠性。通过云平台的分布式架构,从整体系统上提高可靠性,降低系统对单设备可靠性的要求。 可用性…

2023年国赛 高教社杯数学建模思路 - 案例:退火算法

文章目录 1 退火算法原理1.1 物理背景1.2 背后的数学模型 2 退火算法实现2.1 算法流程2.2算法实现 建模资料 ## 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 退火算法原理 1.1 物理背景 在热力学上&a…

Windows10批处理命令行设置环境变量笔记,无需重新安装python与chrome

近期,工作中经常安装、部署python生产、开发环境,比较麻烦,也没有心情去优化。突然,我的电脑崩溃了,在重新安装电脑的过程中,保留了原来的安装软件(有的没有放在系统盘中)&#xff0…

【生态经济学】利用R语言进行经济学研究技术——从数据的收集与清洗、综合建模评价、数据的分析与可视化、因果推断等方面入手

查看原文>>>如何快速掌握利用R语言进行经济学研究技术——从数据的收集与清洗、综合建模评价、数据的分析与可视化、因果推断等方面入手 近年来,人工智能领域已经取得突破性进展,对经济社会各个领域都产生了重大影响,结合了统计学、…

vue 简单实验 自定义组件 component

1.代码 <script src"https://unpkg.com/vuenext" rel"external nofollow" ></script> <div id"components-demo"><button-counter></button-counter> </div> <script> // 创建一个Vue 应用 const ap…

6种方法Word中的页眉横线如何删除

01 如何给Word添加页眉&#xff1f; 方法1&#xff1a; 打开Word文档&#xff0c;将鼠标放在Word顶部&#xff0c;双击鼠标&#xff0c;就可以进入页眉编辑状态&#xff0c;这时候&#xff0c;直接添加页眉内容就好了。 方法2&#xff1a; 在Word文档顶部菜单栏点击【插入】…

【数据结构】C语言实现栈(详细解读)

前言: &#x1f4a5;&#x1f388;个人主页:​​​​​​Dream_Chaser&#xff5e; &#x1f388;&#x1f4a5; ✨✨专栏:http://t.csdn.cn/oXkBa ⛳⛳本篇内容:c语言数据结构--C语言实现栈 目录 什么是栈 栈的概念及结构 实现栈的方式 链表的优缺点: 顺序表的优缺点: 栈…

高性能网络模式-Reactor

事实上&#xff0c;Reactor 模式也叫Dispatcher模式&#xff0c;即I/O 多路复⽤监听事件&#xff0c;收到事件后&#xff0c;根据事件类型分配&#xff08;Dispatch&#xff09;给某个进程/线程。Reactor 模式也是一种非阻塞同步网络模式。 Reactor 模式主要由 Reactor部分和处…

platform相关资料

Step 1: Hardware Settings for Vitis Platform — Vitis™ Tutorials 2021.2 documentationhttps://xilinx.github.io/Vitis-Tutorials/2021-2/build/html/docs/Vitis_Platform_Creation/Introduction/03_Edge_VCK190/step1.html https://www.cnblogs.com/VagueCheung/p/1313…

Jmeter 快速生成测试报告

我们使用Jmeter工具进行接口测试或性能测试后一般是通过察看结果数、聚合报告等监听器来查看响应结果。如果要跟领导汇报测试结果&#xff0c;无法直接通过监听器的结果来进行展示和汇报&#xff0c;因为太low了&#xff0c;因此测试完成后去整理一个数据齐全且美观的报告是非常…

如何基于亚马逊云科技打造高性能的 SQL 向量数据库 MyScale

MyScale 是一款完全托管于亚马逊云科技、支持 SQL 的高效向量数据库。MyScale 的优势在于&#xff0c;它在提供与专用向量数据库相匹敌甚至优于的性能的同时&#xff0c;还支持完整的 SQL 语法。在这篇文章中&#xff0c;我们将阐述 MyScale 是如何借助亚马逊云科技的基础设施&…

6G太赫兹波频段

6G目前处于非常早期的研究阶段。国际电信联盟所期待的“网络2030”愿景正在逐步实现。虽然该行业距离进入6G标准开发进程还有几年的时间&#xff0c;但亚太赫兹&#xff08;sub-THz&#xff09;技术已经成为研究的重点。 6G一个关键目标和积极研究领域是实现 100 Gbps 至 1 Tb…

洗涤护理门店小程序DIY制作教程

随着移动互联网的快速发展&#xff0c;小程序成为了各行各业推广和服务的新平台。对于干洗店来说&#xff0c;拥有一个专属的洗护小程序不仅可以提升用户体验&#xff0c;还能增加店铺的曝光度和销售额。那么&#xff0c;如何DIY制作一个干洗店洗护小程序呢&#xff1f; 首先&a…

React笔记[tsx]-解决Property ‘frames‘ does not exist on type ‘Readonly<{}>‘

浏览器报错如下&#xff1a; 编辑器是这样的&#xff1a; 原因是React.Component<any>少了后面的any&#xff0c;改成这样即可&#xff1a; export class CustomFrame extends React.Component<any, any>{............ }

第二章-自动驾驶卡车-自动驾驶卡车前装量产的要求

1、自动驾驶卡车的特点与挑战 重卡主要运行在相对封闭的高速公路&#xff0c;相较城市道路场景看似更简单。但是&#xff0c;由于重卡特有的物理特性、运行环境和商业运营要求&#xff0c;相较于乘用车的自动驾驶系统&#xff0c;重卡的自动驾驶系统对车辆的感知距离和精度、系…