国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

面試官:說說@Async的底層實現?

開發 前端
@Async 是 Spring 3.0 提供的一個注解,用于標識某類(下的公共方法)或某方法會執行異步調用。接下來,我們來看下 ?@Async 的基本使用和實現原理。

@Async 是 Spring 3.0 提供的一個注解,用于標識某類(下的公共方法)或某方法會執行異步調用。

接下來,我們來看下  @Async 的基本使用和實現原理。

1.基本使用

@Async 基本使用可以分為以下 3 步:

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

1.1 開啟異步支持

以 Spring Boot 項目為例,我們首先需要在 Spring Boot 的啟動類,也就是帶有@SpringBootApplication 注解的類上添加 @EnableAsync 注解,以開啟異步方法執行的支持,如下代碼所示:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;

@SpringBootApplication
@EnableAsync
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

1.2 創建異步方法

創建異步方法是在需要異步執行的方法上添加 @Async 注解,這個方法一定是要放在被 IoC 容器管理的 Bean 中,只有被 IoC 管理的類才能實現異步調用,例如在帶有 @Service 注解的類中創建異步方法:

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncService {

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

1.3 調用異步方法

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
publicclass MyController {

    @Autowired
    private AsyncService asyncService;

    @GetMapping("/startAsync")
    public String startAsyncTask() {
        asyncService.performAsyncTask();
        return"異步任務已啟動";
    }
}

2.實現原理

簡單來說,@Async 注解是由 AOP(面向切面)實現的,具體來說,它是由 AsyncAnnotationAdvisor 這個切面類來實現的。

在 AsyncAnnotationAdvisor 中,會使用 AsyncExecutionInterceptor 來處理 @Async 注解,它會在被 @Async 注解標識的方法被調用時,創建一個異步代理對象來執行方法。這個異步代理對象會在一個新的線程中調用被 @Async 注解標識的方法,從而實現方法的異步執行。

在 AsyncExecutionInterceptor 中,核心方法是 getDefaultExecutor 方法,使用此方法來獲取一個線程池來執行被 @Async 注解修飾的方法,它的實現源碼如下:

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

此方法實現比較簡單,它是先嘗試調用父類 AsyncExecutionAspectSupport#getDefaultExecutor 方法獲取線程池,如果父類方法獲取不到線程池再用創建 SimpleAsyncTaskExecutor 對象作為 Async 的線程池返回。

而 SimpleAsyncTaskExecutor 中在執行任務時是這樣的:

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

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

然而,在 Spring Boot 中,因為在框架啟動時,自動注入了 ThreadPoolTaskExecutor,如下源碼所示:

@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() {
    }
}

具體的構建細節源碼如下:

@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 注解,無需擔心它每次都會創建線程來執行的問題

責任編輯:武曉燕 來源: 磊哥和java
相關推薦

2024-08-22 10:39:50

@Async注解代理

2024-02-29 16:49:20

volatileJava并發編程

2024-03-14 14:56:22

反射Java數據庫連接

2024-08-29 16:30:27

2024-03-06 15:38:06

Spring微服務架構擴展組件

2020-07-02 07:52:11

RedisHash映射

2024-03-05 10:33:39

AOPSpring編程

2024-09-04 17:35:09

2024-12-06 07:00:00

2024-07-31 08:28:37

DMAIOMMap

2022-06-15 15:14:17

Java公平鎖非公平鎖

2024-09-20 08:36:43

零拷貝數據傳輸DMA

2024-03-22 06:56:24

零拷貝技術數據傳輸數據拷貝

2024-08-12 17:36:54

2025-02-28 00:00:00

2021-06-07 17:12:22

線程安全Atomic

2024-06-04 09:02:03

2024-03-28 10:37:44

IoC依賴注入依賴查找

2024-12-04 14:45:14

零拷貝技術CPU 拷貝Zero-copy

2024-03-01 11:33:31

點贊
收藏

51CTO技術棧公眾號

国产传媒欧美日韩成人| 久久精品视频亚洲| 免费精品视频一区| 超级碰碰久久| 国产精品电影院| 精品免费日产一区一区三区免费| 大桥未久在线视频| 亚洲欧洲三级电影| 91嫩草免费看| 都市激情综合| 欧美日韩激情一区| 国产自偷自偷免费一区 | 亚洲三级视频在线观看| 欧美gay男男猛男无套| 一女二男3p波多野结衣| 91精品亚洲一区在线观看| 最新不卡av在线| 欧美日韩一区二区视频在线观看| 国产在线自天天| 亚洲激情成人在线| 欧美韩国日本在线| 久久99久国产精品黄毛片色诱| 国产精品毛片a∨一区二区三区|国| 波多野结衣在线高清| 午夜精品福利一区二区三区蜜桃| 久久综合九色综合88i| 嫩草成人www欧美| 国产精品第3页| 国产亚洲一区| 国产精品www色诱视频| 国产精品nxnn| 红桃视频欧美| 91免费福利视频| 97超碰在线资源站| 亚洲综合免费观看高清完整版| 视频在线不卡| 日韩精品一区二区视频| 成人免费黄色网页| 久久久成人精品| 精品国产亚洲一区二区三区在线 | 欧美一级二级三级视频| 日韩精品福利在线| 午夜激情成人网| 国产丝袜高跟一区| 嫩呦国产一区二区三区av| 欧美 日韩 亚洲 一区| 黄色成人av网| 夜色资源站国产www在线视频| 九色精品美女在线| 一本精品一区二区三区| 欧美日韩国内自拍| 一二三四社区在线视频| 亚洲电影中文字幕在线观看| 日本激情综合网| 国产精品久久久久久福利一牛影视| 国产av人人夜夜澡人人爽| 亚洲欧洲另类国产综合| 色婷五月综激情亚洲综合| 亚洲天堂精品视频| 亚洲精华国产| 欧美网站在线观看| av网站大全在线| 亚洲欧美综合图区| 日本一区二区三区视频在线看 | 国产一区二区三区网站| 欧美电影网站| 欧美精品在线免费播放| 国产一区二区在线视频你懂的| 欧美在线观看一区二区三区| 日韩一区二区中文| 精品国产二区在线| 毛片基地黄久久久久久天堂| 草草草视频在线观看| 久久九九国产精品| 在线观看免费视频一区二区三区| 91成人在线精品| sm久久捆绑调教精品一区| 一二美女精品欧洲| 99青草视频在线播放视| 亚洲国产精品久久精品怡红院 | 在线免费观看a视频| 日韩在线小视频| 一区二区三区四区在线看| 国产伦一区二区三区色一情| 国产在线日韩欧美| 九色视频网站入口| 日韩视频免费观看高清完整版| 国产精品欧美一区二区| 蜜臀av一区二区| 一区二区三区四区| 国产欧美一区二区精品秋霞影院| 在线视频尤物| 亚洲人线精品午夜| 日韩伦理一区| 欧美又粗又长又爽做受| 婷婷激情综合网| 亚洲天堂一区二区| 国产精品久久久久久久午夜| 久久av中文字幕片| 国产九色porn网址| 亚洲第一av在线| 亚洲第一福利社区| 一区精品在线| 亚洲一区二区三区四区五区中文| 岛国av在线网站| 欧美日韩一区不卡| 成人性片免费| 国产伦理久久久| 国产亚洲人成网站| 韩国精品视频| 欧美激情精品久久久久久蜜臀| 亚洲美女视频在线免费观看| 亚洲国产精品久久久久爰色欲| 91国产视频在线观看| 999色成人| 日韩高清专区| 精品国产精品三级精品av网址| 久久av影院| 国模精品一区二区三区| 国产精品高潮久久久久无| 三妻四妾完整版在线观看电视剧 | 特级西西444www大精品视频| 最新高清无码专区| 九九精品调教| 亚洲最大福利视频| 国产精品香蕉av| 亚洲欧美视频一区二区三区| 在线观看成人网| 亚洲欧美激情精品一区二区| 影音先锋成人在线电影| 免费涩涩18网站入口| 亚洲黄色在线看| 欧美国产三级| 99re热在线观看| 中文精品99久久国产香蕉| 久久婷婷av| 免费在线视频一级不卡| 欧美一级在线亚洲天堂| 91伊人久久大香线蕉| 欧美韩日亚洲| 国产精品日韩一区二区 | 久久爱av电影| 亚洲成人av福利| 超碰成人在线观看| 91精品国产一区二区三区动漫| 在线成人一区二区| 免费观看久久av| 无码人妻丰满熟妇区毛片18| 亚洲美女久久久| 久久国产福利国产秒拍| 顶级网黄在线播放| 91久久伊人青青碰碰婷婷| 一区二区三区波多野结衣在线观看| 国产精品视频一区二区三区| 色一情一乱一乱一区91| 亚洲а∨天堂久久精品9966| 亚洲一区二区三区高清不卡| 国产三级视频在线看| 亚洲一区中文字幕| 婷婷久久综合九色国产成人| 欧美hd在线| 日本一卡二卡四卡精品| 91美女片黄在线观| 欧美日韩亚洲网| 亚洲一区二区三区| 精品视频二区| 91久久偷偷做嫩草影院| 91黄色激情网站| 亚洲欧美日韩专区| 黄色在线观看视频网站| 国产日产欧美一区二区| 中文字幕久精品免费视频| 懂色av一区二区三区免费观看| 日韩精品一区二区三区| 国产成+人+综合+亚洲欧美丁香花| 成人欧美一区二区三区视频| 成人的网站免费观看| 日韩毛片在线| 人妻熟女一二三区夜夜爱| 欧美激情一级欧美精品| 国产精品久久久久影院老司| 欧美日韩一区二区三区不卡视频| 99在线欧洲视频| 成人疯狂猛交xxx| 欧美中文字幕一区二区三区亚洲| 精久久久久久| 51漫画成人app入口| 国产高清www| 久久久伊人日本| 精品久久香蕉国产线看观看gif| 在线成人av| 中文在线а√天堂| 日韩有码免费视频| 国产精品视频久| 欧美精选一区二区| 国产麻豆视频一区| 精品福利一区| www.成人.com| 久久亚洲中文字幕无码| 国产成人精品免高潮在线观看|