1. 程式人生 > >spring boot 學習(十一)使用@Async實現異步調用

spring boot 學習(十一)使用@Async實現異步調用

fontsize south 操作 dom img water 截圖 ota app

使用@Async實現異步調用

什麽是”異步調用”與”同步調用”

“同步調用”就是程序按照一定的順序依次執行,,每一行程序代碼必須等上一行代碼執行完畢才能執行;”異步調用”則是只要上一行代碼執行,無需等待結果的返回就開始執行本身任務。
通常情況下,”同步調用”執行程序所花費的時間比較多,執行效率比較差。所以,在代碼本身不存在依賴關系的話,我們可以考慮通過”異步調用”的方式來並發執行。

“異步調用”

在 spring boot 框架中,只要提過@Async註解就能獎普通的同步任務改為異步調用任務。
註意: @Async所修飾的函數不要定義為static類型,這樣異步調用不會生效

1. 開啟@Async註解

在Spring Boot主類添加@EnableAsync註解

2. 定義異步任務

定義Task類,創建三個處理函數分別模擬三個執行任務的操作,操作消耗時間隨機取(10秒內)。

@Component
public class Task {

    //定義一個隨機對象.
    public static Random random =new Random();

    @Async  //加入"異步調用"註解
    public void doTaskOne() throws InterruptedException {
        System.out.println("開始執行任務一");
        long start = System.currentTimeMillis();
        Thread.sleep(random.nextInt(10000));
        long end = System.currentTimeMillis();
        System.out.println("完成任務一,耗時:" + (end - start) + "毫秒");
    }

    @Async
    public void doTaskTwo() throws InterruptedException {
        System.out.println("開始執行任務二");
        long start = System.currentTimeMillis();
        Thread.sleep(random.nextInt(10000));
        long end = System.currentTimeMillis();
        System.out.println("完成任務二,耗時:" + (end - start) + "毫秒");
    }

    @Async
    public void doTaaskThree() throws InterruptedException {
        System.out.println("開始執行任務三");
        long start = System.currentTimeMillis();
        Thread.sleep(random.nextInt(10000));
        long end = System.currentTimeMillis();
        System.out.println("完成任務三,耗時:" + (end - start) + "毫秒");
    }
}

3. 創建Controller進行測試

註意@Autowired註入類,因為這個類已經被 Spring 管理了。如果使用 new 來獲得線程類將不會執行異步效果,這裏涉及到在 Spring 中使用多線程。

@Controller
public class TaskController {

    @Autowired
    private Task TASK;

    @ResponseBody
    @RequestMapping("/task")
    public String task() throws Exception {
        System.out.println("開始執行Controller任務");
        long start = System.currentTimeMillis();
        TASK.doTaskOne();
        TASK.doTaskTwo();
        TASK.doTaaskThree();
        long end = System.currentTimeMillis();
        System.out.println("完成Controller任務,耗時:" + (end - start) + "毫秒");
        return "success";
    }
}

4. 多次調用

訪問 http://localhost:8080/task 截圖:
技術分享圖片

spring boot 學習(十一)使用@Async實現異步調用