三種SpringBoot中實(shí)現(xiàn)異步調(diào)用的方法總結(jié)
1、基于注解 @Async
@Async 注解是 Spring 提供的一種輕量級(jí)異步方法實(shí)現(xiàn)方式,它可以標(biāo)記在方法上,用來告訴 Spring 這個(gè)方法是一個(gè)異步方法,Spring 會(huì)將這個(gè)方法的執(zhí)行放在異步線程中進(jìn)行。使用 @Async 注解需要滿足以下條件:
- 需要在 Spring Boot 主類上添加 @EnableAsync 注解啟用異步功能;
- 需要在異步方法上添加 @Async 注解。
示例代碼如下:
@SpringBootApplication @EnableAsync public?class?Application?{ ????public?static?void?main(String[]?args)?{ ????????SpringApplication.run(Application.class,?args); ????} } @Service public?class?AsyncService?{ ????@Async ????public?void?asyncTask()?{ ????????//?異步任務(wù)執(zhí)行的邏輯 ????} }
2、使用 CompletableFuture 實(shí)現(xiàn)異步任務(wù)
CompletableFuture 是 Java 8 新增的一個(gè)異步編程工具,它可以方便地實(shí)現(xiàn)異步任務(wù)。使用 CompletableFuture 需要滿足以下條件:
- 異步任務(wù)的返回值類型必須是 CompletableFuture 類型;
- 在異步任務(wù)中使用 CompletableFuture.supplyAsync() 或 CompletableFuture.runAsync() 方法來創(chuàng)建異步任務(wù);
- 在主線程中使用 CompletableFuture.get() 方法獲取異步任務(wù)的返回結(jié)果。
示例代碼如下:
@Service public?class?AsyncService?{ ????public?CompletableFuture<String>?asyncTask()?{ ????????return?CompletableFuture.supplyAsync(()?->?{ ????????????//?異步任務(wù)執(zhí)行的邏輯 ????????????return?"異步任務(wù)執(zhí)行完成"; ????????}); ????} }
3、使用 TaskExecutor 實(shí)現(xiàn)異步任務(wù)
TaskExecutor 是 Spring 提供的一個(gè)接口,它定義了一個(gè)方法 execute(),用來執(zhí)行異步任務(wù)。使用 TaskExecutor 需要滿足以下條件:
- 需要在 Spring 配置文件中配置一個(gè) TaskExecutor 實(shí)例;
- 在異步方法中調(diào)用 TaskExecutor 實(shí)例的 execute() 方法來執(zhí)行異步任務(wù)。
示例代碼如下:
@Configuration @EnableAsync public?class?AsyncConfig?implements?AsyncConfigurer?{ ????@Bean(name?=?"asyncExecutor") ????public?TaskExecutor?asyncExecutor()?{ ????????ThreadPoolTaskExecutor?executor?=?new?ThreadPoolTaskExecutor(); ????????executor.setCorePoolSize(10); ????????executor.setMaxPoolSize(20); ????????executor.setQueueCapacity(100); ????????executor.setThreadNamePrefix("async-"); ????????executor.initialize(); ????????return?executor; ????} ????@Override ????public?Executor?getAsyncExecutor()?{ ????????return?asyncExecutor(); ????} ????@Override ????public?AsyncUncaughtExceptionHandler?getAsyncUncaughtExceptionHandler()?{ ????????return?new?SimpleAsyncUncaughtExceptionHandler(); ????} } @Service public?class?AsyncService?{ ????@Autowired ????@Qualifier("asyncExecutor") ????private?TaskExecutor?taskExecutor; ????public?void?asyncTask()?{ ????????taskExecutor.execute(()?->?{ ????????????//?異步任務(wù)執(zhí)行的邏輯 ????????}); ????} }
4、優(yōu)缺點(diǎn)總結(jié)
這三種實(shí)現(xiàn)異步任務(wù)的方法各有優(yōu)缺點(diǎn),具體如下:
1.基于注解的方式
優(yōu)點(diǎn):
- 簡(jiǎn)單易用,只需要在方法上添加@Async注解即可。
- 依賴Spring框架,集成度高,可以與其他Spring組件無縫協(xié)作。
缺點(diǎn):
- 方法必須是public,否則異步執(zhí)行無效。
- 不能直接獲取異步執(zhí)行結(jié)果,需要使用Future或CompletableFuture等類型。
2.實(shí)現(xiàn)AsyncConfigurer接口的方式
優(yōu)點(diǎn):
- 更加靈活,可以配置線程池等異步執(zhí)行的相關(guān)參數(shù)。
- 可以通過實(shí)現(xiàn)AsyncUncaughtExceptionHandler接口來捕獲異步執(zhí)行中的異常。
缺點(diǎn):
- 需要在代碼中手動(dòng)創(chuàng)建線程池,相對(duì)比較繁瑣。
- 方法必須返回Future或CompletableFuture等類型,否則無法異步執(zhí)行。
3.基于ThreadPoolTaskExecutor的方式
優(yōu)點(diǎn):
- 基于Spring內(nèi)置的線程池實(shí)現(xiàn),省去手動(dòng)配置線程池的繁瑣過程。
- 可以設(shè)置隊(duì)列容量和拒絕策略,控制異步任務(wù)的執(zhí)行順序和并發(fā)量。
缺點(diǎn):
略微復(fù)雜,需要手動(dòng)創(chuàng)建ThreadPoolTaskExecutor實(shí)例,并將其注入到需要異步執(zhí)行的方法中。
綜上所述,每種實(shí)現(xiàn)異步任務(wù)的方式各有優(yōu)缺點(diǎn),需要根據(jù)具體需求和場(chǎng)景來選擇適合的方法。
到此這篇關(guān)于三種SpringBoot中實(shí)現(xiàn)異步調(diào)用的方法總結(jié)的文章就介紹到這了,更多相關(guān)SpringBoot異步調(diào)用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Springboot中yml對(duì)于list列表配置方式詳解
這篇文章主要介紹了Springboot中yml對(duì)于list列表配置方式詳解,使用@ConfigurationProperties讀取yml配置文件過程中會(huì)遇到讀取yml文件中列表,Config里面使用List集合接收,方法比較簡(jiǎn)單,需要的朋友可以參考下2023-11-11Spring中的FactoryBean與ObjectFactory詳解
這篇文章主要介紹了Spring中的FactoryBean與ObjectFactory詳解,FactoryBean是一種特殊的bean,本身又是個(gè)工廠,實(shí)現(xiàn)了FactoryBean的bean會(huì)被注冊(cè)到容器中,需要的朋友可以參考下2023-12-12java實(shí)現(xiàn)學(xué)生管理系統(tǒng)(面向?qū)ο?
這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)學(xué)生管理系統(tǒng)(面向?qū)ο螅闹惺纠a介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03