1. 程式人生 > >SpringBoot中@Async註解配合@EnableAsync註解開啟非同步任務詳解

SpringBoot中@Async註解配合@EnableAsync註解開啟非同步任務詳解

前言

@Async為非同步註解,放到需要使用非同步的方法上面,表示呼叫該方法的執行緒與此方法非同步執行,需要配合@EnableAsync註解使用。

沒有非同步執行,沒有@Async註解時

1、建立一個普通的類,並注入到IOC容器中

package com.example.demo;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class CountNumber {

    public void PrintNumber(){
        for(int i=1; i<10; i++){
            System.out.println("i = " + i);
        }
    }
}

2、在Spring Boot的啟動類中獲取IOC的bean

package com.example.demo;
import java.util.concurrent.TimeUnit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;

//@SpringBootApplication
@ComponentScan
public class Springboot3Application {

    public static void main(String[] args) throws Exception {

        ConfigurableApplicationContext context = SpringApplication.run(Springboot3Application.class, args);

    context.getBean(CountNumber.class).PrintNumber();
        for(int i=1; i<10; i++){
            System.out.println("------------------");
        }
        context.close();
    }
}

3、執行輸出結果

i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------
------------------

從輸出結果中可以看出,啟動類先從IOC容器中獲取CountNumber的物件,然後執行該物件的PrintNumber方法,迴圈列印了9個數字,方法執行結束後,繼續回到啟動類中往下執行,因此開始執行for迴圈語句。從整個流程看屬於順序執行的。

非同步執行任務,加入@Async註解時

1、建立一個普通類,並注入到IOC容器中,並在該類的方法上標註@Async註解,表示該方法是非同步執行的

package com.example.demo;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Component
public class CountNumber {
    @Async
    public void PrintNumber(){
        for(int i=1; i<10; i++){
            System.out.println("i = " + i);
        }
    }
}

2、從spring boot啟動類中獲取IOC中的bean,在啟動類上標註@EnableAsync註解,啟動@Async非同步註解。或者在啟動類中只標註@SpringBootApplication註解,因為該註解中已經包含了上面兩個註解。

package com.example.demo;
import java.util.concurrent.TimeUnit;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;

/*@SpringBootApplication註解與@ComponentScan、@EnableAsync註解達到相同的功效*/
//@SpringBootApplication
@ComponentScan
@EnableAsync
public class Springboot3Application {

    public static void main(String[] args) throws Exception {

        ConfigurableApplicationContext context = SpringApplication.run(Springboot3Application.class, args);

        /*@Async和@EnableAsync配合使用*/
    context.getBean(CountNumber.class).PrintNumber();
        for(int i=1; i<10; i++){
            TimeUnit.MICROSECONDS.sleep(1);
            System.out.println("------------------");
        }
        context.close();
    }
}

3、執行啟動類,輸出結果如下:

------------------
------------------
------------------
------------------
------------------
------------------
i = 1
i = 2
i = 3
i = 4
i = 5
i = 6
i = 7
i = 8
i = 9
------------------
------------------
------------------

從輸出結果中可以看出,spring boot在獲取到IOC中的CountNumber物件後,一方面繼續向下執行,執行for迴圈語句,另一方面獲取物件後,執行物件中的PrintNumber方法。因此PrintNumber方法是與主執行緒是非同步執行的。

相關推薦

SpringBoot@Async註解配合@EnableAsync註解開啟非同步任務

前言 @Async為非同步註解,放到需要使用非同步的方法上面,表示呼叫該方法的執行緒與此方法非同步執行,需要配合@EnableAsync註解使用。 沒有非同步執行,沒有@Async註解時 1、建立一個普通的類,並注入到IOC容器中 package com.ex

Spring和SpringBoot的@Component 和@ComponentScan註解用法介紹和注意事項

通過本文你將學到: Component Scan是什麼? 為什麼ComponentScan很重要? 專案中Spring Boot會對哪些包自動執行掃描(Component Scan)? 如何利用Spring Boot定義掃描範圍? 專案啟動時關於Compone

spring定時任務(@Scheduled註解

在springMVC裡使用spring的定時任務非常的簡單,如下: (一)在xml里加入task的名稱空間 xmlns:task="http://www.springframework.org/schema/task" http://www.spr

ES2017 非同步函式(async function)

非同步函式中有兩個新的關鍵字async和await async 就是非同步的意思 await 就是等的意思. 暫停函式的執行, 等待非同步任務完成. 宣告非同步函式 /*使用關鍵字 asy

springboot如何使用執行緒池及非同步執行緒

有一些業務需求,需要是非同步進行的,不能影響當前執行緒的執行,在spring boot中則能通過註解和配置快速實現這個。 首先寫個非同步執行緒池配置類,如下: @Configuration @EnableAsync public class AsyncC

js幾種實用的跨域方法原理

自身 標簽 cdc 返回 屬性和方法 插入 實用 封裝 判斷 這裏說的js跨域是指通過js在不同的域之間進行數據傳輸或通信,比如用ajax向一個不同的域請求數據,或者通過js獲取頁面中不同域的框架中(iframe)的數據。只要協議、域名、端口有任何一個不同, 都被當作是不同

java靜態代碼塊的用法—— static用法

super關鍵字 了解 裝載 static關鍵字 super 屬於 註意 lock 自動 (一)java 靜態代碼塊 靜態方法區別一般情況下,如果有些代碼必須在項目啟動的時候就執行的時候,需要使用靜態代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化,在不創建對象的

C++virtual(虛函數)的用法

sla margin tar 實現 store ocs rfs hud iuc int128除法怎麽實現? 怎麽求十億個64位整數的平均數? C語言是否正在走下坡路 看幾遍了 老是1error, 求大神幫忙!!! 狗lKst頻1e甘邪攪http://jz.docin

android黑科技系列——微信定位聊天記錄照片的位置信息插件開發

poi 圖片查看 遍歷 什麽 term 反射 還需要 資料 避免 一、前言 最近關於微信中,朋友之間發送原圖就可能暴露你的位置信息,其實這個問題不在於微信,微信是為了更好的體驗效果,才有發送原圖功能,而對於拍照,發送普通圖片微信後臺都會過濾圖片的exif信息,這樣就不會攜

C#常見的系統內置委托用法

dal lock 遞歸 ble sco 結合 靈活運用 並排 同時 一般來說,C#在公共語言運行時(CLR)環境中系統為我們內置了一些常用的委托,包括Action類的委托、Func類的委托、Predicate<T>委托、Comparison<T>委

PythonGradient Boosting Machine(GBM)調參方法

損失函數 二叉樹 lai 打印 探索 for tails 提示 原本 原文地址:Complete Guide to Parameter Tuning in Gradient Boosting (GBM) in Python by Aarshay Jain 原文翻譯與校對:@

Lua的元表(metatable)、元方法(metamethod)

通過 問題 blog tro 設定 神經病 eth title 不可 在第一次看見這兩樣東西的時候,可能會覺得它很深奧,但其實很好理解,雖然實際上它可能真的很深奧。(小若:停!滾粗。) 1.知道為什麽1 + 1 = 2嗎? 為什麽在Lua中,1+1會等於2呢?(小若:難道除

前端框架MVVM數據綁定的實現方式

關系 前端 ont 事情 bubuko tor eval 源碼 fun 最近抽出點時間想弄個dom模塊化的模板引擎,不過現在這種都是MVVM自帶的,索性就想自己造輪子寫一個簡單的MVVM框架了 借鑒的自然還是從正美的avalon開始了,我記得還是去年6月寫過一個系

java web項目redis集群或單擊版配置

redis集群 redis單機 jedis jedis客戶端集群 jedis客戶端單機 單機版配置 <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--

python web開發-flaskresponse、cookies、session對象使用

編程語言 Python Response響應對象:當一個web請求被服務器處理完後,會返回用戶請求的響應,這時候就要用到響應對象,根據響應給用戶的形式不同,響應對象有以下幾種處理方式1. 如果返回的是一個合法的響應對象,它會從視圖直接返回。2. 如果返回的是一個字符串,響應對象會用字符串數據和默認參數

Java集合框架的快速失敗(fail—fast)機制

block rac sms 編程 參數 failsafe next ID ted 先說結論:在用for遍歷一個集合對象時,如果遍歷過程中對集合對象的內容進行了修改(增加、刪除),則會拋出ConcurrentModificationException。在單線程下用叠代器遍歷

Angular通過$location獲取地址欄的參數

localhost function arch app 附加 進行 utf 對象 scope Angular中通過$location獲取url中的參數   最近,項目開發正在進行時,心有點燥,許多東西沒來得及去研究,今天正想問題呢,同事問到如何獲取url中的參數,我一時半會

springboot整合quartz定時器實現定時任務

最近需要 做一個按照時間,定時初始化一些資訊的功能,研究了一下quartz,也簡單瞭解一下TimerTask,廢話不多說。 quartz和TimerTask的區別: timer是jdk自帶的(可想而知,肯定是不怎麼好用)。 Quartz可以通過cron表示式精確到特定時間執行,而T

在 Angular6 使用 HTTP 請求服務端資料的步驟

第一步 準備好api介面地址, 例如 https://api.example.com/api/ 第二步 在根元件 app.components.ts 中引入 HttpClientModule 模組。 ? 1 2 3 4 5 6 7

專案執行緒原來是這麼使用的(

實現執行緒同步的幾種方式 1.同步方法 即有synchronized關鍵字修飾的方法。 由於java的每個物件都有一個內建鎖,當用此關鍵字修飾方法時, 內建鎖會保護整個方法。在呼叫該方法前,需要獲得內建鎖,否則就處於阻塞狀態。 程式碼如: public synchro