1. 程式人生 > 其它 >SpringBoot整合Async實現非同步呼叫

SpringBoot整合Async實現非同步呼叫

技術標籤:SpringBoot基礎入門Spring

目錄

一 同步呼叫和非同步呼叫的區別

二 匯入Async依賴

三 開啟非同步呼叫

四 示例程式碼


一 同步呼叫和非同步呼叫的區別

同步呼叫:同步呼叫是一種阻塞式呼叫,一段程式碼呼叫另一端程式碼時,必須等待這段程式碼執行結束並返回結果後,程式碼才能繼續執行下去;

非同步呼叫:非同步呼叫是一種非阻塞式呼叫,一段非同步程式碼還未執行完,可以繼續執行下一段程式碼邏輯,當代碼執行完以後,通過回撥函式返回繼續執行相應的邏輯,而不耽誤其他程式碼的執行。

二 匯入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");

    }

執行結果