spring boot 使用@Async實(shí)現(xiàn)異步調(diào)用方法
使用@Async實(shí)現(xiàn)異步調(diào)用
什么是”異步調(diào)用”與”同步調(diào)用”
“同步調(diào)用”就是程序按照一定的順序依次執(zhí)行,,每一行程序代碼必須等上一行代碼執(zhí)行完畢才能執(zhí)行;”異步調(diào)用”則是只要上一行代碼執(zhí)行,無(wú)需等待結(jié)果的返回就開(kāi)始執(zhí)行本身任務(wù)。
通常情況下,”同步調(diào)用”執(zhí)行程序所花費(fèi)的時(shí)間比較多,執(zhí)行效率比較差。所以,在代碼本身不存在依賴關(guān)系的話,我們可以考慮通過(guò)”異步調(diào)用”的方式來(lái)并發(fā)執(zhí)行。
“異步調(diào)用”
在 spring boot 框架中,只要提過(guò)@Async注解就能獎(jiǎng)普通的同步任務(wù)改為異步調(diào)用任務(wù)。
注意: @Async所修飾的函數(shù)不要定義為static類型,這樣異步調(diào)用不會(huì)生效
1. 開(kāi)啟@Async注解
在Spring Boot主類添加@EnableAsync注解
2. 定義異步任務(wù)
定義Task類,創(chuàng)建三個(gè)處理函數(shù)分別模擬三個(gè)執(zhí)行任務(wù)的操作,操作消耗時(shí)間隨機(jī)?。?0秒內(nèi))。
@Component public class Task { //定義一個(gè)隨機(jī)對(duì)象. public static Random random =new Random(); @Async //加入"異步調(diào)用"注解 public void doTaskOne() throws InterruptedException { System.out.println("開(kāi)始執(zhí)行任務(wù)一"); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); System.out.println("完成任務(wù)一,耗時(shí):" + (end - start) + "毫秒"); } @Async public void doTaskTwo() throws InterruptedException { System.out.println("開(kāi)始執(zhí)行任務(wù)二"); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); System.out.println("完成任務(wù)二,耗時(shí):" + (end - start) + "毫秒"); } @Async public void doTaaskThree() throws InterruptedException { System.out.println("開(kāi)始執(zhí)行任務(wù)三"); long start = System.currentTimeMillis(); Thread.sleep(random.nextInt(10000)); long end = System.currentTimeMillis(); System.out.println("完成任務(wù)三,耗時(shí):" + (end - start) + "毫秒"); } }
3. 創(chuàng)建Controller進(jìn)行測(cè)試
注意@Autowired注入類,因?yàn)檫@個(gè)類已經(jīng)被 Spring 管理了。如果使用 new 來(lái)獲得線程類將不會(huì)執(zhí)行異步效果,這里涉及到在 Spring 中使用多線程。
@Controller public class TaskController { @Autowired private Task TASK; @ResponseBody @RequestMapping("/task") public String task() throws Exception { System.out.println("開(kāi)始執(zhí)行Controller任務(wù)"); long start = System.currentTimeMillis(); TASK.doTaskOne(); TASK.doTaskTwo(); TASK.doTaaskThree(); long end = System.currentTimeMillis(); System.out.println("完成Controller任務(wù),耗時(shí):" + (end - start) + "毫秒"); return "success"; } }
4. 多次調(diào)用
訪問(wèn) http://localhost:8080/task 截圖:
項(xiàng)目參考地址: https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B7
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringMVC結(jié)合模板模式實(shí)現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù)
我們經(jīng)常會(huì)遇到需要傳遞對(duì)象的場(chǎng)景,有時(shí)候,我們需要將一個(gè)對(duì)象的數(shù)據(jù)傳遞給另一個(gè)對(duì)象進(jìn)行處理,但是又不希望直接暴露對(duì)象的內(nèi)部結(jié)構(gòu)和實(shí)現(xiàn)細(xì)節(jié),所以本文給大家介紹了SpringMVC結(jié)合模板模式實(shí)現(xiàn)MyBatisPlus傳遞嵌套JSON數(shù)據(jù),需要的朋友可以參考下2024-03-03Java Shutdown Hook場(chǎng)景使用及源碼分析
shutdown hook 就是一個(gè)簡(jiǎn)單的已初始化但是未啟動(dòng)的線程,本文詳細(xì)的介紹了Java Shutdown Hook場(chǎng)景使用及源碼分析,感興趣的朋友可以參考一下2021-06-06java發(fā)起http請(qǐng)求調(diào)用post與get接口的方法實(shí)例
在實(shí)際開(kāi)發(fā)過(guò)程中,我們經(jīng)常需要調(diào)用對(duì)方提供的接口或測(cè)試自己寫(xiě)的接口是否合適,下面這篇文章主要給大家介紹了關(guān)于java發(fā)起http請(qǐng)求調(diào)用post與get接口的相關(guān)資料,需要的朋友可以參考下2022-08-08Java源碼解析ThreadLocal及使用場(chǎng)景
今天小編就為大家分享一篇關(guān)于Java源碼解析ThreadLocal及使用場(chǎng)景,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-01-01SpringBoot?快速實(shí)現(xiàn)?api?接口加解密功能
在項(xiàng)目中,為了保證數(shù)據(jù)的安全,我們常常會(huì)對(duì)傳遞的數(shù)據(jù)進(jìn)行加密,Spring?Boot接口加密,可以對(duì)返回值、參數(shù)值通過(guò)注解的方式自動(dòng)加解密,這篇文章主要介紹了SpringBoot?快速實(shí)現(xiàn)?api?接口加解密功能,感興趣的朋友一起看看吧2023-10-10