成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring中實現異步調用的方式有哪些?

開發 前端
只要在異步方法上添加@Bean注解,不需要手動調用線程池的initialize()方法,在Bean在初始化之后會自動調用。需要注意的是,在同級類中直接調用異步方法無法實現異步。

一位3年工作經驗的小伙伴被問到這樣一道面試題,說Spring中實現異步調用的方式有哪些?

今天,我給大家分享一下我的理解。

在Spring中,實現異步調用主要有三種方式,分別是注解方式、內置線程池方式和自定義線程池方式。

1、注解方式

可以在配置類和方法上加特定注解。首先,在配置類加上@EnableAsync來啟用異步注解,

如代碼所示:

@EnableAsync//啟用異步支持
@Configuration
public class AppConfig {
}

然后,使用@Async注解標記需要異步執行的方法,

如代碼所示:

@Async
void doSomething() {
// this will be run asynchronously
}

@Async
void doSomething(String s) {
// this will be run asynchronously
}

@Async
Future<String> returnSomething(int i) {
// this will be run asynchronously
}

使用@Async標記的異步方法可以帶參數,也可以帶有返回值。返回值類型必須是java.util.concurrent.Future或其子類,可以是以下3種類型:

1)由Java原生API提供的Future。

2)由Spring提供的ListenableFuture后者AsyncResult。

3)Java 8提供的CompletableFuture。

需要說明的是,@Async默認會使用SimpleAsyncTaskExecutor來執行,而這個線程池不會復用線程。所以,通常要使用異步處理,我們都會自定義線程池。

2、內置線程池方式

可以使用Spring內置的線程池來實現異步調用,比如ThreadPoolTaskExecutor 和SimpleAsyncTaskExecutor。Spring提供了許多TaskExecutor的內置實現。下面簡單介紹5種內置的線程池。

1)SimpleAsyncTaskExecutor:它不會復用線程,每次調用都是啟動一個新線程。

2)ConcurrentTaskExecutor:它是Java API中Executor實例的適配器。

3)ThreadPoolTaskExecutor:這個線程池是最常用的。它公開了用于配置的bean屬性,并將它包裝在TaskExecutor中。

4)WorkManagerTaskExecutor:它基于CommonJ WorkManager來實現的,并且是在Spring上下文中的WebLogic或WebSphere中設置CommonJ線程池的工具類。

5)DefaultManagedTaskExecutor:主要用于支持JSR-236兼容的運行時環境,它是使用JNDI獲得ManagedExecutorService,作為CommonJ WorkManager的替代方案。

通常情況下,ThreadPoolTaskExecuto最為常用,只要當ThreadPoolTaskExecutor不能滿足需求時,可以使用ConcurrentTaskExecutor。如果在代碼中聲明了多個線程池,Spring會默認按照以下搜索順序來調用線程池:

第一步,檢查上下文中的唯一TaskExecutor Bean。

第二步,檢查名為“ taskExecutor”的Executor Bean。

第三步,以上都無法無法處理,就會使用SimpleAsyncTaskExecutor來執行。

3、自定義線程池方式

可以通過實現AsyncConfigurer接口或者直接繼承AsyncConfigurerSupport類來自定義線程池。但是非完全托管的Bean和完全托管的Bean實現方式有點小差異。

首先,來看非完全托管的Spring Bean,實現方式如代碼所示:

@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {

@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(7);
executor.setMaxPoolSize(42);
executor.setQueueCapacity(11);
executor.setThreadNamePrefix("MyExecutor-");
executor.initialize();//手動初始化
return executor;
}

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new MyAsyncUncaughtExceptionHandler();
}
}

在這段代碼中,ThreadPoolTaskExecutor不是完全托管的Spring bean。

然后,來看完全托管的Spring Bean,實現方式如代碼所示:

@Configuration
@EnableAsync
public class AppConfig implements AsyncConfigurer {

@Bean
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(7);
executor.setMaxPoolSize(42);
executor.setQueueCapacity(11);
executor.setThreadNamePrefix("MyExecutor-");
//executor.initialize();//不用手動調用
return executor;
}

@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new MyAsyncUncaughtExceptionHandler();
}
}

只要在異步方法上添加@Bean注解,不需要手動調用線程池的initialize()方法,在Bean在初始化之后會自動調用。需要注意的是,在同級類中直接調用異步方法無法實現異步。

以上就是我對Spring實現異步調用的理解。

責任編輯:武曉燕 來源: Tom彈架構
相關推薦

2022-09-28 14:54:07

Spring注解方式線程池

2024-07-31 15:57:41

2024-10-15 10:28:43

2024-08-12 10:13:01

2010-03-01 14:01:50

WCF服務異步調用

2009-07-01 14:37:14

JavaScript異

2009-07-01 14:23:46

JavaScript異

2021-03-29 09:26:44

SpringBoot異步調用@Async

2009-10-20 16:48:30

C#委托

2009-08-21 11:24:16

C#異步調用

2023-08-23 13:24:00

異步編程方法

2021-03-19 10:14:28

SpringBoot項目異步調用

2020-01-02 16:30:02

Spring BootJava異步請求

2018-06-21 14:46:03

Spring Boot異步調用

2010-02-25 09:13:34

WCF異步調用

2009-12-21 14:10:26

WCF異步調用

2009-11-09 10:50:30

WCF異步調用

2009-07-01 14:31:01

JavaScript異

2009-07-01 13:58:00

JavaScript異

2009-11-06 15:54:15

WCF異步調用
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产日韩欧美一区二区 | www.亚洲视频.com | 亚洲男人网 | 四虎海外 | 欧美456 | 欧美久久不卡 | 久久久毛片 | 精品久久精品 | 欧美综合在线视频 | 亚洲欧美一区二区三区在线 | 免费特黄视频 | 美女久久视频 | 在线一区视频 | 国产一区二区三区免费 | 亚洲精品免费在线观看 | 欧美自拍另类 | 国产美女在线看 | 国内精品一区二区 | 精品国产乱码久久久久久蜜退臀 | 国产精品久久久久久久久久久久久 | 涩涩导航| 成人乱人乱一区二区三区软件 | 天天射天天操天天干 | 一区二区视屏 | 欧美久久视频 | 免费福利视频一区二区三区 | 大学生a级毛片免费视频 | 国产精品久久久久久影院8一贰佰 | 最新黄色在线观看 | 日韩精品1区2区3区 成人黄页在线观看 | 精品国产一区二区三区性色av | 欧美中文字幕一区 | 欧美成人一区二免费视频软件 | 狠狠av | 免费一级欧美在线观看视频 | 亚洲久久一区 | 午夜电影网址 | .国产精品成人自产拍在线观看6 | 亚洲欧美在线视频 | 国产在线91 | 日韩久久久久久 |