spring boot 使用@Async實現(xiàn)異步調(diào)用方法
使用@Async實現(xiàn)異步調(diào)用
什么是”異步調(diào)用”與”同步調(diào)用”
“同步調(diào)用”就是程序按照一定的順序依次執(zhí)行,,每一行程序代碼必須等上一行代碼執(zhí)行完畢才能執(zhí)行;”異步調(diào)用”則是只要上一行代碼執(zhí)行,無需等待結(jié)果的返回就開始執(zhí)行本身任務(wù)。
通常情況下,”同步調(diào)用”執(zhí)行程序所花費的時間比較多,執(zhí)行效率比較差。所以,在代碼本身不存在依賴關(guān)系的話,我們可以考慮通過”異步調(diào)用”的方式來并發(fā)執(zhí)行。
“異步調(diào)用”
在 spring boot 框架中,只要提過@Async注解就能獎普通的同步任務(wù)改為異步調(diào)用任務(wù)。
注意: @Async所修飾的函數(shù)不要定義為static類型,這樣異步調(diào)用不會生效
1. 開啟@Async注解
在Spring Boot主類添加@EnableAsync注解
2. 定義異步任務(wù)
定義Task類,創(chuàng)建三個處理函數(shù)分別模擬三個執(zhí)行任務(wù)的操作,操作消耗時間隨機取(10秒內(nèi))。
@Component
public class Task {
//定義一個隨機對象.
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ù)一,耗時:" + (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ù)二,耗時:" + (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ù)三,耗時:" + (end - start) + "毫秒");
}
}
3. 創(chuàng)建Controller進行測試
注意@Autowired注入類,因為這個類已經(jīng)被 Spring 管理了。如果使用 new 來獲得線程類將不會執(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ù),耗時:" + (end - start) + "毫秒");
return "success";
}
}
4. 多次調(diào)用
訪問 http://localhost:8080/task 截圖:

項目參考地址: https://github.com/FunriLy/springboot-study/tree/master/%E6%A1%88%E4%BE%8B7
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
java并發(fā)編程包JUC線程同步CyclicBarrier語法示例
這篇文章主要為大家介紹了java并發(fā)編程工具包JUC線程同步CyclicBarrier語法使用示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-03-03
Spring boot中PropertySource注解的使用方法詳解
這篇文章主要給大家介紹了關(guān)于Spring boot中PropertySource注解的使用方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Spring boot具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
ElasticSearch不停機重建索引延伸思考及優(yōu)化詳解
這篇文章主要為大家介紹了ElasticSearch不停機重建索引延伸思考及優(yōu)化詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-02-02
Java StringBuffer類與StringBuilder類用法實例小結(jié)
這篇文章主要介紹了Java StringBuffer類與StringBuilder類用法,結(jié)合實例形式總結(jié)分析了Java StringBuffer類與StringBuilder類的功能、原理及添加、刪除、替換、截取等操作實現(xiàn)技巧,需要的朋友可以參考下2019-03-03
Java中if...else語句使用的學(xué)習(xí)教程
這篇文章主要介紹了Java中if...else語句使用的學(xué)習(xí)教程,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下2015-11-11
使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案
這篇文章主要介紹了使用easyexcel導(dǎo)出的excel文件,使用poi讀取時異常處理方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12

