SpringBoot中使用@Async實(shí)現(xiàn)異步任務(wù)調(diào)用詳解
一、什么是asynchronous call(異步調(diào)用)
一個(gè)可以無需等待被調(diào)用函數(shù)的返回值就讓操作繼續(xù)進(jìn)行的方法(來自百度百科)。
即程序在順序執(zhí)行時(shí),不等待異步調(diào)用的語句返回結(jié)果就執(zhí)行后面的程序。
二、Spring Boot 使用 @Async 注解實(shí)現(xiàn)異步化
我們只需要通過使用 @Async 注解就能簡單的將同步函數(shù)變?yōu)楫惒胶瘮?shù),例如新建一個(gè) Asynctask 異步任務(wù)類,源碼如下。
package com.example.asynctask.asynvtask; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; /** * @description * @date 2019/4/19 11:20 */ @Component public class Asynctask { // 任務(wù)一 @Async public void doTaskOne() throws Exception { System.out.println("開始做任務(wù)一"); long start = System.currentTimeMillis(); Thread.sleep(3000); long end = System.currentTimeMillis(); System.out.println("完成任務(wù)一,耗時(shí):" + (end - start) + "毫秒"); } // 任務(wù)二 @Async public void doTaskTwo() throws Exception { System.out.println("開始做任務(wù)二"); long start = System.currentTimeMillis(); Thread.sleep(5000); long end = System.currentTimeMillis(); System.out.println("完成任務(wù)二,耗時(shí):" + (end - start) + "毫秒"); } // 任務(wù)3 @Async public void doTaskThree() throws Exception { System.out.println("開始做任務(wù)三"); long start = System.currentTimeMillis(); Thread.sleep(8000); long end = System.currentTimeMillis(); System.out.println("完成任務(wù)三,耗時(shí):" + (end - start) + "毫秒"); } }
為了讓 @Async 注解能夠生效,還需要在 SpringBoot 的主程序中配置 @EnableAsync,如下所示。
package com.example.asynctask; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication @EnableAsync public class AsynctaskApplication { public static void main(String[] args) { SpringApplication.run(AsynctaskApplication.class, args); } }
編寫測試類,源碼如下。
package com.example.asynctask.controller; import com.example.asynctask.asynvtask.Asynctask; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @description @Async 注解實(shí)現(xiàn)異步任務(wù) * @date 2019/4/19 11:20 */ @RestController @RequestMapping("/test") public class AsynctaskController { @Resource private Asynctask asynctask; @RequestMapping("/task") public String task2() throws Exception { asynctask.doTaskOne(); asynctask.doTaskTwo(); asynctask.doTaskThree(); return "===== test ok ====="; } }
測試結(jié)果:反復(fù)執(zhí)行時(shí),可能出現(xiàn)多種不同的測試結(jié)果(任務(wù)1、2、3執(zhí)行順序不同),以下是一種情況。
開始做任務(wù)三
開始做任務(wù)一
開始做任務(wù)二
完成任務(wù)一,耗時(shí):2992毫秒
完成任務(wù)二,耗時(shí):4987毫秒
完成任務(wù)三,耗時(shí):7980毫秒
三、注意事項(xiàng)
1、在 @SpringBootApplication 啟動(dòng)類添加注解@EnableAsync;
2、異步方法使用注解 @Async ,返回值為 void 或者 Future;
3、切記一點(diǎn) ,異步方法和調(diào)用方法要分別寫在不同的類中,如果寫在一個(gè)類中,是沒有效果的。
到此這篇關(guān)于SpringBoot中使用@Async實(shí)現(xiàn)異步任務(wù)調(diào)用詳解的文章就介紹到這了,更多相關(guān)@Async異步任務(wù)調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringBoot開啟異步調(diào)用方法
- SpringBoot異步調(diào)用方法實(shí)現(xiàn)場景代碼實(shí)例
- 淺析SpringBoot微服務(wù)中異步調(diào)用數(shù)據(jù)提交數(shù)據(jù)庫的問題
- 三種SpringBoot中實(shí)現(xiàn)異步調(diào)用的方法總結(jié)
- SpringBoot使用@Async注解實(shí)現(xiàn)異步調(diào)用
- 淺談SpringBoot實(shí)現(xiàn)異步調(diào)用的幾種方式
- SpringBoot中異步調(diào)用時(shí)的注意事項(xiàng)
- SpringBoot實(shí)現(xiàn)異步調(diào)用的方法示例
相關(guān)文章
基于Cookie與Session的Servlet?API會話管理操作
這篇文章主要為大家介紹了基于Cookie與Session的Servlet?API會話管理操作詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08解決IDEA2020.2插件lombok報(bào)錯(cuò)問題(親測有效)
這篇文章主要介紹了解決IDEA2020.2插件lombok報(bào)錯(cuò)問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08Spring Boot創(chuàng)建可執(zhí)行jar包的實(shí)例教程
這篇文章主要介紹了Spring Boot創(chuàng)建可執(zhí)行jar包的實(shí)例教程,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實(shí)現(xiàn)原理
這篇文章主要介紹了詳解Spring依賴注入:@Autowired,@Resource和@Inject區(qū)別與實(shí)現(xiàn)原理,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-06-06java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法
本文主要介紹了java高并發(fā)寫入用戶信息到數(shù)據(jù)庫的幾種方法,具有很好的參考價(jià)值。下面跟著小編一起來看下吧2017-03-03