您好,登錄后才能下訂單哦!
在spring boot中如何使用@Async實(shí)現(xiàn)異步調(diào)用?相信很多沒有經(jīng)驗(yàn)的人對(duì)此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個(gè)問題。
什么是”異步調(diào)用”與”同步調(diào)用”
“同步調(diào)用”就是程序按照一定的順序依次執(zhí)行,,每一行程序代碼必須等上一行代碼執(zhí)行完畢才能執(zhí)行;”異步調(diào)用”則是只要上一行代碼執(zhí)行,無需等待結(jié)果的返回就開始執(zhí)行本身任務(wù)。
通常情況下,”同步調(diào)用”執(zhí)行程序所花費(fèi)的時(shí)間比較多,執(zhí)行效率比較差。所以,在代碼本身不存在依賴關(guān)系的話,我們可以考慮通過”異步調(diào)用”的方式來并發(fā)執(zhí)行。
“異步調(diào)用”
在 spring boot 框架中,只要提過@Async注解就能獎(jiǎng)普通的同步任務(wù)改為異步調(diào)用任務(wù)。
注意: @Async所修飾的函數(shù)不要定義為static類型,這樣異步調(diào)用不會(huì)生效
1. 開啟@Async注解
在Spring Boot主類添加@EnableAsync注解
2. 定義異步任務(wù)
定義Task類,創(chuàng)建三個(gè)處理函數(shù)分別模擬三個(gè)執(zhí)行任務(wù)的操作,操作消耗時(shí)間隨機(jī)取(10秒內(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("開始執(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("開始執(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("開始執(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 來獲得線程類將不會(huì)執(zhí)行異步效果,這里涉及到在 Spring 中使用多線程。
@Controller public class TaskController { @Autowired private Task TASK; @ResponseBody @RequestMapping("/task") public String task() throws Exception { System.out.println("開始執(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)用
訪問 http://localhost:8080/task 截圖:
看完上述內(nèi)容,你們掌握在spring boot中如何使用@Async實(shí)現(xiàn)異步調(diào)用的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。