SpringBoot用@Async注解實現(xiàn)異步任務(wù)
什么是異步調(diào)用?
異步調(diào)用是相對于同步調(diào)用而言的,同步調(diào)用是指程序按預(yù)定順序一步步執(zhí)行,每一步必須等到上一步執(zhí)行完后才能執(zhí)行,異步調(diào)用則無需等待上一步程序執(zhí)行完即可執(zhí)行。
如何實現(xiàn)異步調(diào)用?
多線程,這是很多人第一眼想到的關(guān)鍵詞,沒錯,多線程就是一種實現(xiàn)異步調(diào)用的方式。
在非spring目項目中我們要實現(xiàn)異步調(diào)用的就是使用多線程方式,可以自己實現(xiàn)Runable接口或者集成Thread類,或者使用jdk1.5以上提供了的Executors線程池。
StrngBoot中則提供了很方便的方式執(zhí)行異步調(diào)用。
異步接口的使用場景
耗時比較長,任務(wù)比較多的接口。比方說,文件下載,大文件下載比較耗時,這個時候就可以使用異步接口。
項目示例已上傳至GitHub,可見github項目地址。
在解釋異步調(diào)用之前,我們先來看同步調(diào)用的定義;同步就是整個處理過程順序執(zhí)行,當各個過程都執(zhí)行完畢,并返回結(jié)果。 異步調(diào)用則是只是發(fā)送了調(diào)用的指令,調(diào)用者無需等待被調(diào)用的方法完全執(zhí)行完畢;而是繼續(xù)執(zhí)行下面的流程。
例如, 在某個調(diào)用中,需要順序調(diào)用 A, B, C三個過程方法;如他們都是同步調(diào)用,則需要將他們都順序執(zhí)行完畢之后,方算作過程執(zhí)行完畢; 如B為一個異步的調(diào)用方法,則在執(zhí)行完A之后,調(diào)用B,并不等待B完成,而是執(zhí)行開始調(diào)用C,待C執(zhí)行完畢之后,就意味著這個過程執(zhí)行完畢了。
@Async介紹
基于@Async標注的方法稱為異步方法,方法在執(zhí)行的時候,將會在獨立的線程中被執(zhí)行,調(diào)用者無需等待它的完成,即可繼續(xù)其他的操作。使用時在SpringBoot主配置類中開啟異步即可。
@EnableAsync @SpringBootApplication public class SpringBootAsyncTestApplication {
無返回值異步方法
@Async public void asyncMethodWithNoReturnType() { try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("asyncMethodWithNoReturnType..."); }
使用方法比較簡單,編寫一個測試方法并加上@Async注解即可。
含返回值異步方法
@Async public Future<String> asyncMethodWithReturnType() { try { Thread.sleep(3000); return new AsyncResult<String>("success"); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("asyncMethodWithReturnType..."); return null; }
返回值利用Future泛型接口實現(xiàn)。
Future是對于具體的 Runnable 或者 Callable 任務(wù)的執(zhí)行結(jié)果進行取消、查詢是否完成、獲取結(jié)果的接口,必要時可以通過get方法獲取執(zhí)行結(jié)果,該方法會阻塞直到任務(wù)返回結(jié)果,包含了以下幾個方法。
public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean isDone(); V get() throws InterruptedException, ExecutionException; V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException; }
1.cancel方法的作用是取消任務(wù),取消任務(wù)成功則返回true,反之返回false。參數(shù) mayInterruptIfRunning 表示是否允許取消正在執(zhí)行卻沒有執(zhí)行完畢的任務(wù)。
運行cancel方法取消任務(wù)時:
i.若任務(wù)已完成:則無論 mayInterruptIfRunning 為 true 或 false,此方法都返回 false,即取消已經(jīng)完成的任務(wù)都會返回false。
i.若任務(wù)正在執(zhí)行:
- mayInterruptIfRunning 設(shè)置為 true,則返回true。
- mayInterruptIfRunning 設(shè)置為false,則返回false。
iii.如果任務(wù)未執(zhí)行,則無論mayInterruptIfRunning為true還是false,都返回true。
2.isCancelled方法的作用是判斷任務(wù)是否被取消成功,若在任務(wù)正常完成前被取消,則返回 true。
3.isDone方法的作用是判斷任務(wù)是否已經(jīng)完成,若任務(wù)已完成,則返回true。
4.get()方法的作用是獲取執(zhí)行結(jié)果,注意此方法會產(chǎn)生阻塞,等到任務(wù)執(zhí)行完畢后才能獲得執(zhí)行結(jié)果。
5.get(long timeout, TimeUnit unit)方法的作用同樣是獲取執(zhí)行結(jié)果,若在指定時間內(nèi)還未獲取到執(zhí)行結(jié)果,則返回null。
編寫測試接口
編寫/callWithNoReturnType和/callWithReturnType接口用于查看異步任務(wù)的執(zhí)行過程。
@RestController public class AsyncController { @Autowired AsyncService asynSerivce; @GetMapping("/callWithNoReturnType") public String callWithNoReturnType() { asynSerivce.asyncMethodWithNoReturnType(); return "success"; } @GetMapping("/callWithReturnType") public String callWithReturnType() { Future<String> future=asynSerivce.asyncMethodWithReturnType(); try { return future.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } return "fail"; }
運行項目后使用Postman進行接口測試,分別給/callWithNoReturnType和/callWithReturnType接口發(fā)送Get請求,調(diào)用無返回值的異步方法asyncWithNoReturnType時,會立即返回返回值。但調(diào)用含返回值異步方法asyncWithReturnType時,由于我們調(diào)用了get()方法,會在等待3000毫秒后,才返回返回值。
到此這篇關(guān)于SpringBoot用@Async注解實現(xiàn)異步任務(wù)的文章就介紹到這了,更多相關(guān)SpringBoot @Async異步內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 簡述Springboot @Async 異步方法
- springboot實現(xiàn)異步調(diào)用@Async的示例
- 詳解springboot使用異步注解@Async獲取執(zhí)行結(jié)果的坑
- SpringBoot異步使用@Async的原理以及線程池配置詳解
- springboot?@Async?注解如何實現(xiàn)方法異步
- SpringBoot使用@Async注解處理異步事件的方法
- Springboot如何使用@Async實現(xiàn)異步任務(wù)
- SpringBoot使用@Async注解實現(xiàn)異步調(diào)用
- springboot異步@Async的使用及失效場景介紹
相關(guān)文章
IntelliJ IDEA基于SpringBoot如何搭建SSM開發(fā)環(huán)境的步驟詳解
這篇文章主要介紹了IntelliJ IDEA基于SpringBoot如何搭建SSM開發(fā)環(huán)境,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10解決報錯:java:讀取jar包時出錯:error in opening zip 
文章總結(jié):解決Java讀取jar包時出錯的問題,通過下載源碼并刷新項目解決了問題,希望對大家有所幫助2024-11-11SpringBoot實現(xiàn)本地存儲文件上傳及提供HTTP訪問服務(wù)的方法
這篇文章主要介紹了SpringBoot實現(xiàn)本地存儲文件上傳及提供HTTP訪問服務(wù),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08HashMap紅黑樹入門(實現(xiàn)一個簡單的紅黑樹)
紅黑樹(Red Black Tree) 是一種自平衡二叉查找樹,是在計算機科學中用到的一種數(shù)據(jù)結(jié)構(gòu),典型的用途是實現(xiàn)關(guān)聯(lián)數(shù)組。 紅黑樹發(fā)明時被稱為平衡二叉B樹,后來修改為如今的“紅黑樹”2021-06-06Java使用正則表達式檢索、替換String中特定字符和正則表達式的一切
這篇文章主要給大家介紹了關(guān)于Java使用正則表達式檢索、替換String中特定字符和正則表達式的一切,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-09-09springboot整合xxl-job的實現(xiàn)示例
本文主要介紹了springboot整合xxl-job的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-06-06JAVA代碼設(shè)置selector不同狀態(tài)下的背景顏色
這篇文章主要介紹了JAVA代碼設(shè)置selector不同狀態(tài)下的背景顏色,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-05-05SpringBoot @CompentScan excludeFilters配置無效的解決方案
這篇文章主要介紹了SpringBoot @CompentScan excludeFilters配置無效的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11