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

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

阿里面試:說說@Async實現原理?

來源: 責編: 時間:2024-07-06 07:43:56 943觀看
導讀@Async 是 Spring 3.0 提供的一個注解,用于標識某類(下的公共方法)或某方法會執行異步調用。接下來,我們來看下 @Async 的基本使用和實現原理。1.基本使用@Async 基本使用可以分為以下 3 步:項目中開啟異步支持創建異步方

@Async 是 Spring 3.0 提供的一個注解,用于標識某類(下的公共方法)或某方法會執行異步調用。jVO28資訊網——每日最新資訊28at.com

接下來,我們來看下  @Async 的基本使用和實現原理。jVO28資訊網——每日最新資訊28at.com

1.基本使用

@Async 基本使用可以分為以下 3 步:jVO28資訊網——每日最新資訊28at.com

  • 項目中開啟異步支持
  • 創建異步方法
  • 調用異步方法

1.1 開啟異步支持

以 Spring Boot 項目為例,我們首先需要在 Spring Boot 的啟動類,也就是帶有@SpringBootApplication 注解的類上添加 @EnableAsync 注解,以開啟異步方法執行的支持,如下代碼所示:jVO28資訊網——每日最新資訊28at.com

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.scheduling.annotation.EnableAsync;@SpringBootApplication@EnableAsyncpublic class MyApplication {    public static void main(String[] args) {        SpringApplication.run(MyApplication.class, args);    }}

1.2 創建異步方法

創建異步方法是在需要異步執行的方法上添加 @Async 注解,這個方法一定是要放在被 IoC 容器管理的 Bean 中,只有被 IoC 管理的類才能實現異步調用,例如在帶有 @Service 注解的類中創建異步方法:jVO28資訊網——每日最新資訊28at.com

import org.springframework.scheduling.annotation.Async;import org.springframework.stereotype.Service;@Servicepublic class AsyncService {    @Async    public void performAsyncTask() {        // 這里放置需要異步執行的代碼        System.out.println("異步任務正在執行,當前線程:" + Thread.currentThread().getName());    }}

1.3 調用異步方法

在其他類或方法中,通過注入這個服務類的實例來調用異步方法。注意,直接在同一個類內部調用不會觸發異步行為,必須通過注入的實例調用,使用 new 創建的對象也不能進行異步方法調用,具體實現代碼如下:jVO28資訊網——每日最新資訊28at.com

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;@RestControllerpublic class MyController {    @Autowired    private AsyncService asyncService;    @GetMapping("/startAsync")    public String startAsyncTask() {        asyncService.performAsyncTask();        return "異步任務已啟動";    }}

2.實現原理

簡單來說,@Async 注解是由 AOP(面向切面)實現的,具體來說,它是由 AsyncAnnotationAdvisor 這個切面類來實現的。jVO28資訊網——每日最新資訊28at.com

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

在 AsyncExecutionInterceptor 中,核心方法是 getDefaultExecutor 方法,使用此方法來獲取一個線程池來執行被 @Async 注解修飾的方法,它的實現源碼如下:jVO28資訊網——每日最新資訊28at.com

@Nullableprotected Executor getDefaultExecutor(@Nullable BeanFactory beanFactory) {    Executor defaultExecutor = super.getDefaultExecutor(beanFactory);    return (Executor)(defaultExecutor != null ? defaultExecutor : new SimpleAsyncTaskExecutor());}

此方法實現比較簡單,它是先嘗試調用父類 AsyncExecutionAspectSupport#getDefaultExecutor 方法獲取線程池,如果父類方法獲取不到線程池再用創建 SimpleAsyncTaskExecutor 對象作為 Async 的線程池返回。jVO28資訊網——每日最新資訊28at.com

而 SimpleAsyncTaskExecutor 中在執行任務時是這樣的:jVO28資訊網——每日最新資訊28at.com

protected void doExecute(Runnable task) {    this.newThread(task).start();}

可以看出,在 Spring 框架中如果使用默認的 @Async 注解,它的執行比較簡單粗暴,并沒有使用線程池,而是每次創建線程來執行,所以在 Spring 框架中是不能直接使用 @Async 注解的,需要使用 @Async 注解搭配自定義的線程池,既實現 AsyncConfigurer 接口來提供自定義的 ThreadPoolTaskExecutor 來創建線程池,以確保 @Async 能真正的使用線程池來執行異步任務。jVO28資訊網——每日最新資訊28at.com

然而,在 Spring Boot 中,因為在框架啟動時,自動注入了 ThreadPoolTaskExecutor,如下源碼所示:jVO28資訊網——每日最新資訊28at.com

@ConditionalOnClass({ThreadPoolTaskExecutor.class})@AutoConfiguration@EnableConfigurationProperties({TaskExecutionProperties.class})@Import({TaskExecutorConfigurations.ThreadPoolTaskExecutorBuilderConfiguration.class, TaskExecutorConfigurations.TaskExecutorBuilderConfiguration.class, TaskExecutorConfigurations.SimpleAsyncTaskExecutorBuilderConfiguration.class, TaskExecutorConfigurations.TaskExecutorConfiguration.class})public class TaskExecutionAutoConfiguration {    public static final String APPLICATION_TASK_EXECUTOR_BEAN_NAME = "applicationTaskExecutor";    public TaskExecutionAutoConfiguration() {    }}

具體的構建細節源碼如下:jVO28資訊網——每日最新資訊28at.com

@Bean@ConditionalOnMissingBean({TaskExecutorBuilder.class, ThreadPoolTaskExecutorBuilder.class})ThreadPoolTaskExecutorBuilder threadPoolTaskExecutorBuilder(TaskExecutionProperties properties, ObjectProvider<ThreadPoolTaskExecutorCustomizer> threadPoolTaskExecutorCustomizers, ObjectProvider<TaskExecutorCustomizer> taskExecutorCustomizers, ObjectProvider<TaskDecorator> taskDecorator) {    TaskExecutionProperties.Pool pool = properties.getPool();    ThreadPoolTaskExecutorBuilder builder = new ThreadPoolTaskExecutorBuilder();    builder = builder.queueCapacity(pool.getQueueCapacity());    builder = builder.corePoolSize(pool.getCoreSize());    builder = builder.maxPoolSize(pool.getMaxSize());    builder = builder.allowCoreThreadTimeOut(pool.isAllowCoreThreadTimeout());    builder = builder.keepAlive(pool.getKeepAlive());    TaskExecutionProperties.Shutdown shutdown = properties.getShutdown();    builder = builder.awaitTermination(shutdown.isAwaitTermination());    builder = builder.awaitTerminationPeriod(shutdown.getAwaitTerminationPeriod());    builder = builder.threadNamePrefix(properties.getThreadNamePrefix());    Stream var10001 = threadPoolTaskExecutorCustomizers.orderedStream();    Objects.requireNonNull(var10001);    builder = builder.customizers(var10001::iterator);    builder = builder.taskDecorator((TaskDecorator)taskDecorator.getIfUnique());    builder = builder.additionalCustomizers(taskExecutorCustomizers.orderedStream().map(this::adapt).toList());    return builder;}

因此在 Spring Boot 框架中可以直接使用 @Async 注解,無需擔心它每次都會創建線程來執行的問題。jVO28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-99169-0.html阿里面試:說說@Async實現原理?

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

上一篇: Go語言助力安全測試:24小時內發送5億次HTTP/1.1請求

下一篇: 為什么要限流?及常用的限流算法解析

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
欧美在线播放视频| 久久久五月婷婷| 欧美视频在线观看免费网址| 开元免费观看欧美电视剧网站| 久久成人免费| 美女图片一区二区| 欧美日韩精品是欧美日韩精品| 欧美日精品一区视频| 欧美精品一区二区三区高清aⅴ| 欧美粗暴jizz性欧美20| 欧美日韩一区二区在线视频| 国产精品免费视频xxxx| 国产精品乱码妇女bbbb| 黄色成人av在线| 一区二区三区在线高清| 欧美日韩一区成人| 国产精品丝袜xxxxxxx| 狠狠色综合色区| 亚洲美女毛片| 欧美在线视频观看| 蜜臀a∨国产成人精品| 欧美午夜精品久久久久久超碰| 国产一区在线免费观看| 先锋资源久久| 欧美aⅴ99久久黑人专区| 国产精品国产自产拍高清av| 狠狠色狠色综合曰曰| 一区二区欧美激情| 久久精品国内一区二区三区| 欧美精品一区二区精品网| 国产区精品在线观看| 亚洲人成网站在线播| 欧美专区在线观看一区| 欧美日韩免费一区二区三区| 激情另类综合| 亚洲一区欧美二区| 欧美1区3d| 国产欧美日韩一区二区三区| 亚洲免费激情| 久久免费视频网| 国产精品推荐精品| 99re热精品| 蜜桃伊人久久| 国外成人在线视频| 亚洲欧美日韩国产| 欧美巨乳在线| 亚洲国产精品久久91精品| 欧美亚洲一区二区在线| 欧美日韩国产不卡在线看| 在线视频观看日韩| 久久成人综合视频| 国产精品三级视频| 夜夜嗨av一区二区三区四季av | 国产精品久久久久一区二区三区| 在线看成人片| 欧美综合二区| 国产精品影院在线观看| 一区二区精品| 欧美日本三区| 亚洲欧洲综合另类在线| 久久女同互慰一区二区三区| 国产日韩综合一区二区性色av| 亚洲桃色在线一区| 欧美日韩免费观看一区三区| 亚洲第一区在线| 久久精品视频免费播放| 国产精品尤物福利片在线观看| 一区二区三区 在线观看视| 欧美激情综合网| 亚洲国产午夜| 欧美3dxxxxhd| 亚洲国产成人在线| 久久综合久久88| 一区二区亚洲精品| 久久蜜桃精品| 激情视频一区二区三区| 久久精品综合一区| 狠狠综合久久av一区二区小说| 久久激情久久| 国产真实久久| 久久手机免费观看| 在线激情影院一区| 米奇777超碰欧美日韩亚洲| 在线播放不卡| 欧美承认网站| 亚洲精品永久免费| 欧美精品一区二区三区四区| 亚洲精品在线视频观看| 欧美日韩国产区一| 一区二区三区免费网站| 国产精品v欧美精品∨日韩| 亚洲少妇一区| 国产精品视频一二| 欧美亚洲三级| 一区视频在线播放| 欧美69wwwcom| 99在线精品观看| 国产精品久久久久久一区二区三区 | 欧美h视频在线| 91久久精品视频| 欧美日韩国产美女| 亚洲图片在线观看| 国产精品一区2区| 久久精品毛片| 亚洲激情午夜| 欧美视频中文一区二区三区在线观看| 亚洲午夜高清视频| 国产亚洲激情在线| 美日韩精品视频| 日韩小视频在线观看专区| 国产精品magnet| 欧美在线视频一区二区三区| 精品成人在线视频| 欧美精品 国产精品| 宅男噜噜噜66一区二区66| 国产精品一区在线观看| 久久一二三区| 一本色道久久综合狠狠躁的推荐| 国产精品高潮呻吟久久av黑人| 亚洲欧美中文日韩v在线观看| 韩国av一区二区三区在线观看| 欧美a级片一区| 亚洲天堂偷拍| 红桃视频一区| 欧美日韩精品中文字幕| 欧美与黑人午夜性猛交久久久| 亚洲国产成人久久综合| 国产精品成人aaaaa网站| 久久精品国产精品 | 久久九九国产精品| 亚洲欧洲一区二区三区久久| 欧美亚日韩国产aⅴ精品中极品| 欧美一区二区三区播放老司机 | 久久久噜噜噜久噜久久| 99国内精品| 国产亚洲精品综合一区91| 欧美国产专区| 欧美一区在线直播| 亚洲九九九在线观看| 国产精品专区第二| 欧美电影免费| 欧美一区激情| 99国产精品久久| 黄色成人免费网站| 欧美视频国产精品| 久久一区中文字幕| 亚洲一区二区三区乱码aⅴ| 亚洲成色www8888| 国产精品日韩在线| 欧美激情精品久久久| 午夜精品美女自拍福到在线| 亚洲日本va午夜在线电影| 国产亚洲视频在线| 欧美视频一区二区在线观看| 久久综合伊人77777麻豆| 亚洲综合色丁香婷婷六月图片| 最新国产の精品合集bt伙计| 国产亚洲欧美日韩一区二区| 欧美日韩精品综合在线| 久久综合婷婷| 欧美在线播放视频| 中国女人久久久| 91久久国产综合久久91精品网站| 国内视频一区| 国产精品一区二区三区久久| 欧美极品在线观看| 美女视频黄 久久| 欧美一区二区三区视频在线 | 亚洲先锋成人| 亚洲精品国产无天堂网2021| 国产亚洲一区在线| 国产精品久久久久99| 欧美精品一区在线发布| 老司机精品久久| 久久国内精品自在自线400部| 亚洲一区在线看| 一本综合久久| 99re6热只有精品免费观看| 亚洲成人在线免费| 禁断一区二区三区在线| 国产亚洲午夜高清国产拍精品| 国产精品久久久久一区二区三区| 欧美精品一区二区久久婷婷| 欧美a级一区| 男男成人高潮片免费网站| 久久久久九九视频| 欧美在线免费观看| 亚洲欧美激情在线视频| 99视频在线观看一区三区| 亚洲人成在线播放| 亚洲激情在线播放| 亚洲高清成人| 亚洲大胆人体视频| 国内精品视频在线播放| 国产一区亚洲| 国内精品国语自产拍在线观看| 国产麻豆午夜三级精品| 国产美女高潮久久白浆| 国产乱肥老妇国产一区二| 国产精品视频99| 国产精品视频区| 国产农村妇女毛片精品久久莱园子| 国产精品一区二区久激情瑜伽| 国产精品入口福利|