SpringBoot整合Async實現非同步呼叫
阿新 • • 發佈:2021-01-11
技術標籤:SpringBoot基礎入門Spring
目錄
一 同步呼叫和非同步呼叫的區別
同步呼叫:同步呼叫是一種阻塞式呼叫,一段程式碼呼叫另一端程式碼時,必須等待這段程式碼執行結束並返回結果後,程式碼才能繼續執行下去;
非同步呼叫:非同步呼叫是一種非阻塞式呼叫,一段非同步程式碼還未執行完,可以繼續執行下一段程式碼邏輯,當代碼執行完以後,通過回撥函式返回繼續執行相應的邏輯,而不耽誤其他程式碼的執行。
二 匯入Async依賴
無需加入額外依賴;
三 開啟非同步呼叫
在專案的啟動類上新增@EnableAsync註解即可;
@SpringBootApplication
@EnableScheduling
@EnableAsync
public class SpringbootexampleApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootexampleApplication.class, args);
}
}
四 示例程式碼
同步方法執行時間
@Component public class MySyncTask { public void task1() throws InterruptedException { long T1 = System.currentTimeMillis(); Thread.sleep(2000); long T2 = System.currentTimeMillis(); System.out.println("task1消耗時間"+(T2-T1)+"ms"); } public void task2() throws InterruptedException { long T1 = System.currentTimeMillis(); Thread.sleep(3000); long T2 = System.currentTimeMillis(); System.out.println("task2消耗時間"+(T2-T1)+"ms"); } }
方法呼叫
@RequestMapping("syncTask") public void syncTask() throws InterruptedException { long l1 = System.currentTimeMillis(); mySyncTask.task1(); mySyncTask.task2(); long l2 = System.currentTimeMillis(); System.out.println("執行同步消耗時間"+(l2-l1)+"ms"); }
執行結果
非同步方法執行時間
@Component
public class MyAsyncTask {
@Async
public void task1() throws InterruptedException {
long T1 = System.currentTimeMillis();
Thread.sleep(2000);
long T2 = System.currentTimeMillis();
System.out.println("task1消耗時間"+(T2-T1)+"ms");
}
@Async
public void task2() throws InterruptedException {
long T1 = System.currentTimeMillis();
Thread.sleep(3000);
long T2 = System.currentTimeMillis();
System.out.println("task2消耗時間"+(T2-T1)+"ms");
}
}
方法呼叫
@RequestMapping("asyncTask")
public void asyncTask() throws InterruptedException {
long l1 = System.currentTimeMillis();
myAsyncTask.task1();
myAsyncTask.task2();
long l2 = System.currentTimeMillis();
System.out.println("執行非同步消耗時間"+(l2-l1)+"ms");
}
執行結果