当前位置:首页 > 科技  > 软件

浅析Spring中Async注解底层异步线程池原理

来源: 责编: 时间:2024-06-14 08:53:49 289观看
导读一、前言开发中我们经常会用到异步方法调用,具体到代码层面,异步方法调用的实现方式有很多种,比如最原始的通过实现Runnable接口或者继承Thread类创建异步线程,然后启动异步线程;再如,可以直接用java.util.concurrent包提供

一、前言

开发中我们经常会用到异步方法调用,具体到代码层面,异步方法调用的实现方式有很多种,比如最原始的通过实现Runnable接口或者继承Thread类创建异步线程,然后启动异步线程;再如,可以直接用java.util.concurrent包提供的线程池相关API实现异步方法调用。Jnq28资讯网——每日最新资讯28at.com

如果说可以用一行代码快速实现异步方法调用,那是不是比上面方法香很多。Jnq28资讯网——每日最新资讯28at.com

Spring提供了Async注解,就可以帮助我们一行代码搞定异步方法调用。Async注解用起来是很爽,但是如果不对其底层实现做深入研究,难免有时候也会心生疑虑,甚至会因使用不当,遇见一些让人摸不着头脑的问题。Jnq28资讯网——每日最新资讯28at.com

本文首先将对Async注解做简单介绍,然后和大家分享一个我们项目中因Async注解使用不当的线上问题,接着再深扒Spring源码,对Async注解底层异步线程池的实现原理一探究竟。Jnq28资讯网——每日最新资讯28at.com

二、Async注解简介

Jnq28资讯网——每日最新资讯28at.com

Async注解定义源码

Jnq28资讯网——每日最新资讯28at.com

图片图片Jnq28资讯网——每日最新资讯28at.com

从源码可以看出@Async注解定义很简单,只需要关注两点:Jnq28资讯网——每日最新资讯28at.com

  • Target({ElementType.TYPE, ElementType.METHOD})标志Async注解可以作用在方法和类上,作用在类上时,类的所有方法可以实现异步调用。
  • String value( ) default ""是唯一字段属性,用来指定异步线程池,且该字段有缺省值。

Jnq28资讯网——每日最新资讯28at.com

Async注解异步调用实现原理概述Jnq28资讯网——每日最新资讯28at.com

Jnq28资讯网——每日最新资讯28at.com

在Spring框架中,Async注解的实现是通过AOP来实现的。具体来说,Async注解是由AsyncAnnotationAdvisor这个切面类来实现的。Jnq28资讯网——每日最新资讯28at.com

AsyncAnnotationAdvisor类是Spring框架中用于处理Async注解的切面,它会在被Async注解标识的方法被调用时,创建一个异步代理对象来执行方法。这个异步代理对象会在一个新的线程中调用被@Async注解标识的方法,从而实现方法的异步执行。Jnq28资讯网——每日最新资讯28at.com

在AsyncAnnotationAdvisor中,会使用AsyncExecutionInterceptor来处理Async注解。AsyncExecutionInterceptor是实现了MethodInterceptor接口的类,用于拦截被Async注解标识的方法的调用,并在一个新的线程中执行这个方法。Jnq28资讯网——每日最新资讯28at.com

通过AOP的方式实现Async注解的异步执行,Spring框架可以在方法调用时动态地创建代理对象来实现异步执行,而不需要在业务代码中显式地创建新线程。Jnq28资讯网——每日最新资讯28at.com

总的来说,Async注解的实现是通过AOP机制来实现的,具体的切面类是AsyncAnnotationAdvisor,它利用AsyncExecutionInterceptor来处理被Async注解标识的方法的调用,实现方法的异步执行。Jnq28资讯网——每日最新资讯28at.com

三、Async注解底层异步线程池原理探究

Jnq28资讯网——每日最新资讯28at.com

获取Async注解线程池主流程解析

Jnq28资讯网——每日最新资讯28at.com

进入到Spring源码Async注解AOP切面实现部分,我们重点剖析异步调用实现中线程池是怎么处理的。下图是org.springframework.aop.interceptor.AsyncExecutionInterceptor#invoke方法的实现,可以看出是调用determineAsyncExecutor方法获取异步线程池。Jnq28资讯网——每日最新资讯28at.com

AsyncExecutionInterceptor#invokeAsyncExecutionInterceptor#invokeJnq28资讯网——每日最新资讯28at.com

下图是determineAsyncExecutor方法实现:Jnq28资讯网——每日最新资讯28at.com

图片图片Jnq28资讯网——每日最新资讯28at.com

图片图片Jnq28资讯网——每日最新资讯28at.com

左图为AsyncExecutionInterceptor#determineAsyncExecutor,右图为AsyncExecutionAspectSupport#getExecutorQualifierJnq28资讯网——每日最新资讯28at.com

Jnq28资讯网——每日最新资讯28at.com

从代码实现中可以看到determineAsyncExecutor获取线程池的大致流程:Jnq28资讯网——每日最新资讯28at.com

determineAsyncExecutor获取线程池流程determineAsyncExecutor获取线程池流程Jnq28资讯网——每日最新资讯28at.com

如果在使用Async注解时指定了自定义线程池比较好理解,如果使用Async注解时没有指定自定义线程池,Spring是怎么处理默认线程池呢?继续深入源码看看Spring提供的默认线程池的实现。Jnq28资讯网——每日最新资讯28at.com

Jnq28资讯网——每日最新资讯28at.com

Spring是怎么为Async注解提供默认线程池的

Jnq28资讯网——每日最新资讯28at.com

Async注解默认线程池有下面两个方法实现:   Jnq28资讯网——每日最新资讯28at.com

  • org.springframework.aop.interceptor.AsyncExecutionInterceptor#getDefaultExecutor
  • org.springframework.aop.interceptor.AsyncExecutionAspectSupport#getDefaultExecutor

AsyncExecutionInterceptor#getDefaultExecutorAsyncExecutionInterceptor#getDefaultExecutorJnq28资讯网——每日最新资讯28at.com

可以看出AsyncExecutionInterceptor#getDefaultExecutor方法比较简单:先尝试调用父类AsyncExecutionAspectSupport#getDefaultExecutor方法获取线程池,如果父类方法获取不到线程池再用创建SimpleAsyncTaskExecutor对象作为Async的线程池返回。Jnq28资讯网——每日最新资讯28at.com

AsyncExecutionAspectSupport#getDefaultExecutorAsyncExecutionAspectSupport#getDefaultExecutorJnq28资讯网——每日最新资讯28at.com

再来看父类AsyncExecutionAspectSupport#getDefaultExecutor方法的实现,可以看到Spring根据类型从Spring容器中获取TaskExecutor类的实例,先记住这个关键点。Jnq28资讯网——每日最新资讯28at.com

我们知道,Spring根据类型获取实例时,如果spring容器中有且只有一个指定类型的实例对象,会直接返回,否则的话,会抛出NoUniqueBeanDefinitionException异常或者NoSuchBeanDefinitionException异常。Jnq28资讯网——每日最新资讯28at.com

但是,对于Executor类型,Spring容器却“网开一面”,有一个特殊处理:当从Spring容器中获取Executor实例对象时,如果满足@ConditionalOnMissingBean(Executor.class)条件,Spring容器会自动装载一个ThreadPoolTaskExecutor实例对象,而ThreadPoolTaskExecutor是TaskExecutor的实现类。Jnq28资讯网——每日最新资讯28at.com

图片图片Jnq28资讯网——每日最新资讯28at.com

图片图片Jnq28资讯网——每日最新资讯28at.com

左图为TaskExecutionAutoConfiguration,右图为TaskExecutionPropertiesJnq28资讯网——每日最新资讯28at.com

从TaskExecutionProperties和TaskExecutionAutoConfiguration两个配置类我们看到Spring自动装载的ThreadPoolTaskExecutor线程池对象的参数:核心线程数=8;最大线程数=Integer.MAX_VALUE;队列大小=Integer.MAX_VALUE。Jnq28资讯网——每日最新资讯28at.com

四、总结

现在Async注解线程池源码已经看的差不多了,下面这张图是Spring处理Async异步线程池的流程:Jnq28资讯网——每日最新资讯28at.com

Jnq28资讯网——每日最新资讯28at.com

Jnq28资讯网——每日最新资讯28at.com

Async异步线程池获取流程Async异步线程池获取流程Jnq28资讯网——每日最新资讯28at.com

归纳一下:如果在使用Async注解时没有指定自定义的线程池会出现以下几种情况:Jnq28资讯网——每日最新资讯28at.com

  • 当Spring容器中有且仅有一个TaskExecutor实例时,Spring会用这个线程池来处理Async注解的异步任务,这可能会踩坑,如果这个TaskExecutor实例是第三方jar引入的,可能会出现很诡异的问题。
  • Spring创建一个核心线程数=8、最大线程数=Integer.MAX_VALUE、队列大小=Integer.MAX_VALUE的线程池来处理Async注解的异步任务,这时候也可能会踩坑,由于线程池参数设置不合理,核心线程数=8,队列大小过大,如果有大批量并发任务,可能会出现OOM。
  • Spring创建SimpleAsyncTaskExecutor实例来处理Async注解的异步任务,SimpleAsyncTaskExecutor不是一个好的线程池实现类,SimpleAsyncTaskExecutor根据需要在当前线程或者新线程中执行异步任务。如果当前线程已经有空闲线程可用,任务将在当前线程中执行,否则将创建一个新线程来执行任务。由于这个线程池没有线程管理的能力,每次提交任务都实时创建新城,所以如果任务量大,会导致性能下降。

本文链接:http://www.28at.com/showinfo-26-93708-0.html浅析Spring中Async注解底层异步线程池原理

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: React 19 全览,新特性进行一次深度的体验学习

下一篇: 618 入手三星 Galaxy Tab S9 系列 解锁购物「新」方式

标签:
  • 热门焦点
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 一文看懂为苹果Vision Pro开发应用程序

    译者 | 布加迪审校 | 重楼苹果的Vision Pro是一款混合现实(MR)头戴设备。Vision Pro结合了虚拟现实(VR)和增强现实(AR)的沉浸感。其高分辨率显示屏、先进的传感器和强大的处理能力
  • 企业采用CRM系统的11个好处

    客户关系管理(CRM)软件可以为企业提供很多的好处,从客户保留到提高生产力。  CRM软件用于企业收集客户互动,以改善客户体验和满意度。  CRM软件市场规模如今超过580
  • 得物宠物生意「狂飙」,发力“它经济”

    作者|花花小萌主近日,得物宣布正式上线宠物鉴别,通过得物App内的“在线鉴别”,可找到鉴别宠物的选项。通过上传自家宠物的部位细节,就能收获拥有专业资质认证的得物鉴
  • 腾讯盖楼,字节拆墙

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之“想重温暴刷深渊、30+技能搭配暴搓到爽的游戏体验吗?一起上晶核,即刻暴打!”曾凭借直播腾讯旗下代理格斗游戏《DNF》一
  • 认真聊聊东方甄选:如何告别低垂的果实

    来源:山核桃作者:财经无忌爆火一年后,俞敏洪和他的东方甄选依旧是颇受外界关心的“网红”。7月5日至9日,为期5天的东方甄选“甘肃行”首次在自有App内直播,
  • onebot M24巧系列一体机采用轻薄机身设计,现已在各平台开售

    onebot M24 巧系列一体机目前已在线上线下各平台同步开售。onebot M24 巧系列采用一体化轻薄机身设计,最薄处为 10.15mm,拥有宝石红、午夜蓝、石墨绿、雅致
  • 苹果MacBook Pro 2021测试:仍不支持平滑滚动

    据10月30日9to5 Mac 消息报道,苹果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后获得了不错的评价,亮点包括行业领先的性能,令人印象深刻的电池续航,精美丰
  • “买真退假” 这种“羊毛”不能薅

    □ 法治日报 记者 王春   □ 本报通讯员 胡佳丽  2020年初,还在上大学的小东加入了一个大学生兼职QQ群。群主“七王”在群里介绍一些刷单赚
Top