Spring源码学习之:@Async 方法上添加该注解实现异步调用的原理
来源:互联网 发布:java todo用法 编辑:程序博客网 时间:2024/06/05 23:48
spring 在扫描bean的时候会扫描方法上是否包含@async的注解,如果包含的,spring会为这个bean动态的生成一个子类,我们称之为代理类(?),代理类是继承我们所写的bean的,然后把代理类注入进来,那此时,在执行此方法的时候,会到代理类中,代理类判断了此方法需要异步执行,就不会调用父类(我们原本写的bean)的对应方法。spring自己维护了一个队列,他会把需要执行的方法,放入队列中,等待线程池去读取这个队列,完成方法的执行,从而完成了异步的功能。我们可以关注到再配置task的时候,是有参数让我们配置线程池的数量的。因为这种实现方法,所以在同一个类中的方法调用,添加@Async注解是失效的!,原因是当你在同一个类中的时候,方法调用是在类体内执行的,spring无法截获这个方法调用。
那在深入一步,spring为我们提供了AOP,面向切面的功能。他的原理和异步注解的原理是类似的,spring在启动容器的时候,会扫描切面所定义的类。在这些类被注入的时候,所注入的也是代理类,当你调用这些方法的时候,本质上是调用的代理类。通过代理类再去执行父类相对应的方法,那spring只需要在调用之前和之后执行某段代码就完成了AOP的实现了!
异步方法使用范例
<!-- 定时器配置 task:executor/@pool-size:可以指定执行线程池的初始大小、最大大小 task:executor/@queue-capacity:等待执行的任务队列的容量 task:executor/@rejection-policy:当等待队已满时的策略,分为丢弃、由任务执行器直接运行等方式 --> <task:scheduler id="scheduler" pool-size="10" /> <task:executor id="executor" keep-alive="3600" pool-size="100-200" queue-capacity="500" rejection-policy="CALLER_RUNS" /> <task:annotation-driven executor="executor" scheduler="scheduler" />
@Async public void show() throws Exception { Thread.sleep(2 * 1000);//线程睡眠 }
0 0
- Spring源码学习之:@Async 方法上添加该注解实现异步调用的原理
- Spring中@Async注解实现方法的异步调用
- Spring中@Async注解实现“方法”的异步调用
- Spring中@Async注解实现方法的异步调用
- Java并发编程:Spring中使用 @async 注解实现异步调用的原理
- Spring异步方法注解@Async
- Spring异步方法注解 @Async
- spring boot 使用注解@async实现异步调用
- Spring的好用注解之异步注解@Async
- spring boot 学习(十一)使用@Async实现异步调用
- spring @Async 注解异步执行
- spring 异步方法(@Async注解代替多线程 )
- SpringMVC方法的异步调用@Async
- 使用spring的@Async异步执行方法
- 使用spring的@Async异步执行方法
- 使用spring的@Async异步执行方法
- 使用spring的@Async异步执行方法
- 使用spring的@Async异步执行方法
- Java 聊天器,文件传输
- 架构分布式____Redis集群架构各种方案分析
- sql试题汇总——写sql语句
- computer-database 项目在linux环境下的搭建
- RedHat Linux 无法设置用户ID:资源暂时不可用错误解决
- Spring源码学习之:@Async 方法上添加该注解实现异步调用的原理
- iOS学习笔记--图片灰度处理
- Mininet Documents In Chinese
- 正则表达式
- StringBuffer
- word自动生成目录如何从正文第一页开始
- 关于Android中适配器的使用简介
- GC之CMS GC日志分析
- JS中数组的操作