日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

淺析Spring中Async注解底層異步線程池原理

來源: 責編: 時間:2024-06-14 08:53:49 228觀看
導讀一、前言開發中我們經常會用到異步方法調用,具體到代碼層面,異步方法調用的實現方式有很多種,比如最原始的通過實現Runnable接口或者繼承Thread類創建異步線程,然后啟動異步線程;再如,可以直接用java.util.concurrent包提供

一、前言

開發中我們經常會用到異步方法調用,具體到代碼層面,異步方法調用的實現方式有很多種,比如最原始的通過實現Runnable接口或者繼承Thread類創建異步線程,然后啟動異步線程;再如,可以直接用java.util.concurrent包提供的線程池相關API實現異步方法調用。04D28資訊網——每日最新資訊28at.com

如果說可以用一行代碼快速實現異步方法調用,那是不是比上面方法香很多。04D28資訊網——每日最新資訊28at.com

Spring提供了Async注解,就可以幫助我們一行代碼搞定異步方法調用。Async注解用起來是很爽,但是如果不對其底層實現做深入研究,難免有時候也會心生疑慮,甚至會因使用不當,遇見一些讓人摸不著頭腦的問題。04D28資訊網——每日最新資訊28at.com

本文首先將對Async注解做簡單介紹,然后和大家分享一個我們項目中因Async注解使用不當的線上問題,接著再深扒Spring源碼,對Async注解底層異步線程池的實現原理一探究竟。04D28資訊網——每日最新資訊28at.com

二、Async注解簡介

04D28資訊網——每日最新資訊28at.com

Async注解定義源碼

04D28資訊網——每日最新資訊28at.com

圖片圖片04D28資訊網——每日最新資訊28at.com

從源碼可以看出@Async注解定義很簡單,只需要關注兩點:04D28資訊網——每日最新資訊28at.com

  • Target({ElementType.TYPE, ElementType.METHOD})標志Async注解可以作用在方法和類上,作用在類上時,類的所有方法可以實現異步調用。
  • String value( ) default ""是唯一字段屬性,用來指定異步線程池,且該字段有缺省值。

04D28資訊網——每日最新資訊28at.com

Async注解異步調用實現原理概述04D28資訊網——每日最新資訊28at.com

04D28資訊網——每日最新資訊28at.com

在Spring框架中,Async注解的實現是通過AOP來實現的。具體來說,Async注解是由AsyncAnnotationAdvisor這個切面類來實現的。04D28資訊網——每日最新資訊28at.com

AsyncAnnotationAdvisor類是Spring框架中用于處理Async注解的切面,它會在被Async注解標識的方法被調用時,創建一個異步代理對象來執行方法。這個異步代理對象會在一個新的線程中調用被@Async注解標識的方法,從而實現方法的異步執行。04D28資訊網——每日最新資訊28at.com

在AsyncAnnotationAdvisor中,會使用AsyncExecutionInterceptor來處理Async注解。AsyncExecutionInterceptor是實現了MethodInterceptor接口的類,用于攔截被Async注解標識的方法的調用,并在一個新的線程中執行這個方法。04D28資訊網——每日最新資訊28at.com

通過AOP的方式實現Async注解的異步執行,Spring框架可以在方法調用時動態地創建代理對象來實現異步執行,而不需要在業務代碼中顯式地創建新線程。04D28資訊網——每日最新資訊28at.com

總的來說,Async注解的實現是通過AOP機制來實現的,具體的切面類是AsyncAnnotationAdvisor,它利用AsyncExecutionInterceptor來處理被Async注解標識的方法的調用,實現方法的異步執行。04D28資訊網——每日最新資訊28at.com

三、Async注解底層異步線程池原理探究

04D28資訊網——每日最新資訊28at.com

獲取Async注解線程池主流程解析

04D28資訊網——每日最新資訊28at.com

進入到Spring源碼Async注解AOP切面實現部分,我們重點剖析異步調用實現中線程池是怎么處理的。下圖是org.springframework.aop.interceptor.AsyncExecutionInterceptor#invoke方法的實現,可以看出是調用determineAsyncExecutor方法獲取異步線程池。04D28資訊網——每日最新資訊28at.com

AsyncExecutionInterceptor#invokeAsyncExecutionInterceptor#invoke04D28資訊網——每日最新資訊28at.com

下圖是determineAsyncExecutor方法實現:04D28資訊網——每日最新資訊28at.com

圖片圖片04D28資訊網——每日最新資訊28at.com

圖片圖片04D28資訊網——每日最新資訊28at.com

左圖為AsyncExecutionInterceptor#determineAsyncExecutor,右圖為AsyncExecutionAspectSupport#getExecutorQualifier04D28資訊網——每日最新資訊28at.com

04D28資訊網——每日最新資訊28at.com

從代碼實現中可以看到determineAsyncExecutor獲取線程池的大致流程:04D28資訊網——每日最新資訊28at.com

determineAsyncExecutor獲取線程池流程determineAsyncExecutor獲取線程池流程04D28資訊網——每日最新資訊28at.com

如果在使用Async注解時指定了自定義線程池比較好理解,如果使用Async注解時沒有指定自定義線程池,Spring是怎么處理默認線程池呢?繼續深入源碼看看Spring提供的默認線程池的實現。04D28資訊網——每日最新資訊28at.com

04D28資訊網——每日最新資訊28at.com

Spring是怎么為Async注解提供默認線程池的

04D28資訊網——每日最新資訊28at.com

Async注解默認線程池有下面兩個方法實現:   04D28資訊網——每日最新資訊28at.com

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

AsyncExecutionInterceptor#getDefaultExecutorAsyncExecutionInterceptor#getDefaultExecutor04D28資訊網——每日最新資訊28at.com

可以看出AsyncExecutionInterceptor#getDefaultExecutor方法比較簡單:先嘗試調用父類AsyncExecutionAspectSupport#getDefaultExecutor方法獲取線程池,如果父類方法獲取不到線程池再用創建SimpleAsyncTaskExecutor對象作為Async的線程池返回。04D28資訊網——每日最新資訊28at.com

AsyncExecutionAspectSupport#getDefaultExecutorAsyncExecutionAspectSupport#getDefaultExecutor04D28資訊網——每日最新資訊28at.com

再來看父類AsyncExecutionAspectSupport#getDefaultExecutor方法的實現,可以看到Spring根據類型從Spring容器中獲取TaskExecutor類的實例,先記住這個關鍵點。04D28資訊網——每日最新資訊28at.com

我們知道,Spring根據類型獲取實例時,如果spring容器中有且只有一個指定類型的實例對象,會直接返回,否則的話,會拋出NoUniqueBeanDefinitionException異常或者NoSuchBeanDefinitionException異常。04D28資訊網——每日最新資訊28at.com

但是,對于Executor類型,Spring容器卻“網開一面”,有一個特殊處理:當從Spring容器中獲取Executor實例對象時,如果滿足@ConditionalOnMissingBean(Executor.class)條件,Spring容器會自動裝載一個ThreadPoolTaskExecutor實例對象,而ThreadPoolTaskExecutor是TaskExecutor的實現類。04D28資訊網——每日最新資訊28at.com

圖片圖片04D28資訊網——每日最新資訊28at.com

圖片圖片04D28資訊網——每日最新資訊28at.com

左圖為TaskExecutionAutoConfiguration,右圖為TaskExecutionProperties04D28資訊網——每日最新資訊28at.com

從TaskExecutionProperties和TaskExecutionAutoConfiguration兩個配置類我們看到Spring自動裝載的ThreadPoolTaskExecutor線程池對象的參數:核心線程數=8;最大線程數=Integer.MAX_VALUE;隊列大小=Integer.MAX_VALUE。04D28資訊網——每日最新資訊28at.com

四、總結

現在Async注解線程池源碼已經看的差不多了,下面這張圖是Spring處理Async異步線程池的流程:04D28資訊網——每日最新資訊28at.com

04D28資訊網——每日最新資訊28at.com

04D28資訊網——每日最新資訊28at.com

Async異步線程池獲取流程Async異步線程池獲取流程04D28資訊網——每日最新資訊28at.com

歸納一下:如果在使用Async注解時沒有指定自定義的線程池會出現以下幾種情況:04D28資訊網——每日最新資訊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://m.www897cc.com/showinfo-26-93708-0.html淺析Spring中Async注解底層異步線程池原理

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: React 19 全覽,新特性進行一次深度的體驗學習

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

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美精品一区二区三| 一区二区亚洲| 欧美中文字幕第一页| 亚洲精品影视在线观看| 精品av久久久久电影| 欧美成人在线影院| 久久精品国产2020观看福利| 欧美精选在线| 亚洲精品国产精品乱码不99按摩| 久久人人97超碰精品888| 免费亚洲一区| 亚洲日本aⅴ片在线观看香蕉| 亚洲一区制服诱惑| 国产手机视频精品| 国产一区二区日韩精品| 日韩午夜在线播放| 久久成人免费视频| 欧美精品v日韩精品v国产精品| 国产精品美女xx| 亚洲成色www8888| 夜夜嗨av一区二区三区四季av| 久久久91精品国产一区二区精品| 欧美三区在线| 国内激情久久| 性欧美大战久久久久久久久| 国产精品久久久久aaaa| 国产一区二区三区的电影| 亚洲精品久久久久中文字幕欢迎你 | 蜜桃av噜噜一区二区三区| 欧美成人一品| 国产欧美日韩视频| 黄色成人免费网站| 亚洲国产精品一区二区第一页 | 久久久久国产成人精品亚洲午夜| 欧美日韩亚洲在线| 国产精品一区免费观看| 欲色影视综合吧| 久热精品视频在线观看| 欧美视频在线播放| 国产欧美日韩一区| 亚洲成人在线| 欧美在线视频免费观看| 欧美视频导航| 亚洲国产小视频在线观看| 欧美自拍偷拍| 国产精品视频网站| 伊人狠狠色j香婷婷综合| 亚洲欧美另类在线观看| 欧美破处大片在线视频| 在线观看一区| 久久这里有精品15一区二区三区| 狠狠狠色丁香婷婷综合激情| 久久久www免费人成黑人精品| 国产一区在线播放| 中文无字幕一区二区三区| 欧美精品在线播放| 国产综合一区二区| 亚洲欧美精品伊人久久| 国产精品白丝黑袜喷水久久久| 亚洲午夜激情| 国产精品亚洲美女av网站| 欧美一站二站| 亚洲高清中文字幕| 美女黄网久久| 一区二区三区精品国产| 国产精品爽爽爽| 久久久福利视频| 亚洲精品久久久久久久久久久久久| 国产精品一区二区久久| 99视频在线观看一区三区| 欧美噜噜久久久xxx| 一区二区三区四区国产| 欧美视频在线观看一区| 亚洲伊人一本大道中文字幕| 激情婷婷亚洲| 欧美人在线观看| 亚洲男人第一av网站| 国产一区二三区| 欧美激情一区二区三区高清视频| 亚洲永久免费精品| 国产精品一区二区三区乱码| 男女视频一区二区| 亚洲精品视频免费| 欧美日韩国产成人| 亚洲精品系列| 国产日韩欧美一区在线| 亚洲一区美女视频在线观看免费| 久久精品二区| 欧美精品一区二区在线播放| 国产九区一区在线| 欧美在线观看视频一区二区| 亚洲大黄网站| 国产精品v欧美精品∨日韩| 午夜精品理论片| 亚洲精品久久久久久久久久久| 国产一区二区三区四区在线观看 | 国产精品日韩一区| 欧美亚洲一区二区在线观看| 日韩午夜激情av| 在线不卡中文字幕| 欧美精品在线观看91| 欧美大学生性色视频| 另类天堂视频在线观看| 精品动漫一区| 欧美午夜国产| 免费影视亚洲| 欧美有码视频| 亚洲一区二区欧美| 国产日韩在线不卡| 噜噜噜91成人网| 欧美在线视频免费播放| 亚洲一区免费看| 在线亚洲观看| 亚洲精品之草原avav久久| 一区精品在线| 韩国一区二区三区在线观看| 激情久久五月天| 狠狠色丁香婷综合久久| 国产欧美综合在线| 欧美gay视频激情| 久热爱精品视频线路一| 久久精品国内一区二区三区| 久久精品盗摄| 久久中文欧美| 蜜桃av噜噜一区| 欧美大片网址| 欧美日韩国产在线一区| 亚洲欧美中文日韩在线| 久热精品视频在线观看一区| 久久精品一区二区国产| 欧美在线视频a| 欧美主播一区二区三区美女 久久精品人 | 欧美日韩一区二区精品| 欧美日韩精品一区二区在线播放 | 欧美伊人久久大香线蕉综合69| 老司机aⅴ在线精品导航| 欧美a级大片| 欧美日韩视频免费播放| 国产精品日韩在线播放| 狠狠色狠狠色综合系列| 亚洲国产精品日韩| 久久亚洲国产精品一区二区| 欧美日韩综合网| 亚洲天堂网在线观看| 国产精品一区二区女厕厕| 亚洲一区免费在线观看| 噜噜噜在线观看免费视频日韩| 香蕉久久一区二区不卡无毒影院| 久热精品视频| 欧美日韩国产免费| 欧美三级网页| 国产一区二区三区四区三区四| 99国内精品久久| 久久久综合免费视频| 欧美日韩另类视频| 国产精品美女视频网站| 亚洲国产欧美一区二区三区久久| 久久精品理论片| 欧美视频精品一区| 国产精品系列在线| 国产一区二区中文| 最新日韩欧美| 午夜精品久久| 欧美成人午夜| 韩国欧美一区| 欧美一激情一区二区三区| 欧美伦理在线观看| 国产婷婷成人久久av免费高清| 亚洲亚洲精品三区日韩精品在线视频| 欧美精品一区二区视频| 最新成人在线| 久久综合一区| 国内精品久久久久伊人av| 亚洲一区国产| 国产精品久久久亚洲一区| 国产精品99久久久久久宅男 | 欧美区在线观看| 在线日韩欧美| 暖暖成人免费视频| 国产区精品视频| 久久福利一区| 国产一区二区剧情av在线| 欧美日韩在线另类| 激情视频亚洲| 你懂的国产精品永久在线| 尤物yw午夜国产精品视频明星| 欧美激情一区在线| 一区免费观看视频| 欧美在线3区| 伊人久久婷婷| 欧美日本不卡| 亚洲永久免费av| 国产在线国偷精品产拍免费yy| 欧美国产乱视频| 一本久久综合| 国产精品羞羞答答xxdd| 欧美一区二区三区播放老司机| 在线观看不卡av| 欧美日韩亚洲综合| 日韩午夜免费| 国产亚洲欧洲一区高清在线观看| 欧美精品v日韩精品v韩国精品v | 老司机一区二区三区| 日韩香蕉视频|