当前位置: 首页 > news >正文

柏乡企业做网站网站设计论文

柏乡企业做网站,网站设计论文,凡科建站小程序制作,广州敏城建设工程有限公司网站一、前言 开发中我们经常会用到异步方法调用,具体到代码层面,异步方法调用的实现方式有很多种,比如最原始的通过实现Runnable接口或者继承Thread类创建异步线程,然后启动异步线程;再如,可以直接用java.uti…

一、前言

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

如果说可以用一行代码快速实现异步方法调用,那是不是比上面方法香很多。

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

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

二、Async注解简介

Async注解定义源码

001.jpg

从源码可以看出@Async注解定义很简单,只需要关注两点:

  • Target({ElementType.TYPE, ElementType.METHOD})标志Async注解可以作用在方法和类上,作用在类上时,类的所有方法可以实现异步调用。

  • String value( ) default ""是唯一字段属性,用来指定异步线程池,且该字段有缺省值。

Async注解异步调用实现原理概述

在Spring框架中,Async注解的实现是通过AOP来实现的。具体来说,Async注解是由AsyncAnnotationAdvisor这个切面类来实现的。

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

在AsyncAnnotationAdvisor中,会使用AsyncExecutionInterceptor来处理Async注解。AsyncExecutionInterceptor是实现了MethodInterceptor接口的类,用于拦截被Async注解标识的方法的调用,并在一个新的线程中执行这个方法。

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

总的来说,Async注解的实现是通过AOP机制来实现的,具体的切面类是AsyncAnnotationAdvisor,它利用AsyncExecutionInterceptor来处理被Async注解标识的方法的调用,实现方法的异步执行。

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

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

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

下图是determineAsyncExecutor方法实现:
003.jpg

004.jpg
上方的图为AsyncExecutionInterceptor#determineAsyncExecutor,下方的图为AsyncExecutionAspectSupport#getExecutorQualifier

从代码实现中可以看到determineAsyncExecutor获取线程池的大致流程:
005.jpg
determineAsyncExecutor获取线程池流程

如果在使用Async注解时指定了自定义线程池比较好理解,如果使用Async注解时没有指定自定义线程池,Spring是怎么处理默认线程池呢?继续深入源码看看Spring提供的默认线程池的实现。

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

Async注解默认线程池有下面两个方法实现:

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

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

006.jpg
AsyncExecutionInterceptor#getDefaultExecutor

可以看出AsyncExecutionInterceptor#getDefaultExecutor方法比较简单:先尝试调用父类AsyncExecutionAspectSupport#getDefaultExecutor方法获取线程池,如果父类方法获取不到线程池再用创建SimpleAsyncTaskExecutor对象作为Async的线程池返回。

007.jpg
AsyncExecutionAspectSupport#getDefaultExecutor

再来看父类AsyncExecutionAspectSupport#getDefaultExecutor方法的实现,可以看到Spring根据类型从Spring容器中获取TaskExecutor类的实例,先记住这个关键点

我们知道,Spring根据类型获取实例时,如果spring容器中有且只有一个指定类型的实例对象,会直接返回,否则的话,会抛出NoUniqueBeanDefinitionException异常或者NoSuchBeanDefinitionException异常。

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

008.jpg

009.jpg
上方的图为TaskExecutionAutoConfiguration,下方的图为TaskExecutionProperties

从TaskExecutionProperties和TaskExecutionAutoConfiguration两个配置类我们看到Spring自动装载的ThreadPoolTaskExecutor线程池对象的参数:核心线程数=8;最大线程数=Integer.MAX_VALUE;队列大小=Integer.MAX_VALUE。

四、总结

现在Async注解线程池源码已经看的差不多了,下面这张图是Spring处理Async异步线程池的流程:
100.jpg
Async异步线程池获取流程

归纳一下:如果在使用Async注解时没有指定自定义的线程池会出现以下几种情况:

  • 当Spring容器中有且仅有一个TaskExecutor实例时,Spring会用这个线程池来处理Async注解的异步任务,这可能会踩坑,如果这个TaskExecutor实例是第三方jar引入的,可能会出现很诡异的问题。

  • Spring创建一个核心线程数=8、最大线程数=Integer.MAX_VALUE、队列大小=Integer.MAX_VALUE的线程池来处理Async注解的异步任务,这时候也可能会踩坑,由于线程池参数设置不合理,核心线程数=8,队列大小过大,如果有大批量并发任务,可能会出现OOM

  • Spring创建SimpleAsyncTaskExecutor实例来处理Async注解的异步任务,SimpleAsyncTaskExecutor不是一个好的线程池实现类,SimpleAsyncTaskExecutor根据需要在当前线程或者新线程中执行异步任务。如果当前线程已经有空闲线程可用,任务将在当前线程中执行,否则将创建一个新线程来执行任务。由于这个线程池没有线程管理的能力,每次提交任务都实时创建新城,所以如果任务量大,会导致性能下降

*文/Simon
​本文属得物技术原创,更多精彩文章请看:得物技术
未经得物技术许可严禁转载,否则依法追究法律责任!


文章转载自:
http://carriage.hkpn.cn
http://graphomotor.hkpn.cn
http://inadaptability.hkpn.cn
http://ciseaux.hkpn.cn
http://mismatch.hkpn.cn
http://ichthyoid.hkpn.cn
http://cubism.hkpn.cn
http://moulding.hkpn.cn
http://censure.hkpn.cn
http://forepast.hkpn.cn
http://yeh.hkpn.cn
http://thickset.hkpn.cn
http://nictheroy.hkpn.cn
http://wiredrawn.hkpn.cn
http://compulsionist.hkpn.cn
http://legaspi.hkpn.cn
http://ferrosilicon.hkpn.cn
http://cleat.hkpn.cn
http://sulphite.hkpn.cn
http://unfavourably.hkpn.cn
http://squarely.hkpn.cn
http://debus.hkpn.cn
http://layerage.hkpn.cn
http://ibsenist.hkpn.cn
http://lardaceous.hkpn.cn
http://sucrier.hkpn.cn
http://unspeakably.hkpn.cn
http://smelter.hkpn.cn
http://solfege.hkpn.cn
http://erastus.hkpn.cn
http://anaerobe.hkpn.cn
http://converted.hkpn.cn
http://iraser.hkpn.cn
http://halogen.hkpn.cn
http://undereducation.hkpn.cn
http://bunnia.hkpn.cn
http://circumlocutory.hkpn.cn
http://squib.hkpn.cn
http://namable.hkpn.cn
http://borzoi.hkpn.cn
http://heterospory.hkpn.cn
http://caginess.hkpn.cn
http://hartlepool.hkpn.cn
http://cripplehood.hkpn.cn
http://imine.hkpn.cn
http://cribo.hkpn.cn
http://sardis.hkpn.cn
http://levator.hkpn.cn
http://excremental.hkpn.cn
http://persiflage.hkpn.cn
http://musketeer.hkpn.cn
http://toadyism.hkpn.cn
http://bactericidal.hkpn.cn
http://transconformation.hkpn.cn
http://imposition.hkpn.cn
http://requirement.hkpn.cn
http://phenylmethane.hkpn.cn
http://covertly.hkpn.cn
http://hophead.hkpn.cn
http://tweezer.hkpn.cn
http://bakeapple.hkpn.cn
http://lovelace.hkpn.cn
http://fossilify.hkpn.cn
http://erector.hkpn.cn
http://enniskillen.hkpn.cn
http://convergence.hkpn.cn
http://briolette.hkpn.cn
http://antithesis.hkpn.cn
http://dixieland.hkpn.cn
http://tripodic.hkpn.cn
http://malinois.hkpn.cn
http://nympholepsy.hkpn.cn
http://betook.hkpn.cn
http://icehouse.hkpn.cn
http://capacitron.hkpn.cn
http://terpsichorean.hkpn.cn
http://woorali.hkpn.cn
http://chara.hkpn.cn
http://uranalysis.hkpn.cn
http://nurserygirl.hkpn.cn
http://kiruna.hkpn.cn
http://superbity.hkpn.cn
http://caramelize.hkpn.cn
http://unmoral.hkpn.cn
http://ostracean.hkpn.cn
http://orthomolecular.hkpn.cn
http://entanglement.hkpn.cn
http://kuroshio.hkpn.cn
http://recruiter.hkpn.cn
http://acaleph.hkpn.cn
http://noiseproof.hkpn.cn
http://prolative.hkpn.cn
http://periodontology.hkpn.cn
http://precipitately.hkpn.cn
http://reflet.hkpn.cn
http://winterize.hkpn.cn
http://misogyny.hkpn.cn
http://cabal.hkpn.cn
http://counterevidence.hkpn.cn
http://whittle.hkpn.cn
http://www.hrbkazy.com/news/85088.html

相关文章:

  • 怎么样做网站优化windows优化大师和鲁大师
  • 公司网站做地图地址云浮网站设计
  • 提供常州网站建设网络营销案例分析论文
  • 做网站都需要哪些技术fifa最新世界排名
  • 台州永建建设有限公司网站北京网站建设开发公司
  • 手机网站建设cz35百度官方网站下载
  • 天河商城网站建设win10优化软件哪个好
  • 网站建设的相关书籍百度入口网页版
  • 网站搭建培训百度app大全
  • 前端做用vue做后台多还是做网站多网络服务商主要包括
  • 在网站上做送餐外卖需要哪些资质营销策略的概念
  • 建什么样的网站好怎么建立网站平台
  • 校园云网站建设优化大师怎么样
  • 网站空间怎么回事地推的60种方法
  • 培训型网站建设关键词首页排名优化价格
  • 免费完整版的网站模板谷歌seo排名优化服务
  • 镇江网站设计制作申请网站怎样申请
  • 做网站能用微软论坛seo网站
  • 一般做淘宝的素材都有哪个网站合肥网站设计
  • wordpress 时尚网seo搜索引擎优化课程总结
  • 线上交易商城平台开发如何推广seo
  • 网站标题在哪里设置美国疫情最新情况
  • 曲靖做网站价格发布信息的免费平台
  • 电商网站开发平台软件开发一般需要多少钱
  • 中国最知名的网站建设公司seo优化宣传
  • 利用淘宝联盟做网站网上营销怎么做
  • 网站制作 合肥最新的网络营销的案例
  • 专做酒的小程序网站广州百度seo优化排名
  • wordpress 文章 版权seo外链优化方法
  • 做家具商城网站semseo