springboot--異步執行的方法及定時執行的方法


讓方法被調用后異步的執行

        一般來說,要異步執行一個任務都是創建一個線程來專門干這個任務。在springboot中有 @Async 這個注解快速實現方法的異步執行。只需要兩步:第一步: 在啟動類上加上@EnableAsync注解,表示這個程序支持異步的方法。如下:

@EnableAsync
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }
}

第二步:在service層的類的方法上寫上@Async注解,表示這個方法是異步執行的。如下:

@Service
public class MyService {
    @Async
    public void doA() {
        //doSomething
    }
}

這樣,doA()方法被外部調用后就是異步執行的了。

注意:1. 要想使被調用的方法確實是異步的執行,必須是外部調用,在本類的內部其他方法調用此方法仍然是同步的。也因此,異步方法必須是public修飾。

           2.關於返回值: 由於是異步執行方法,這個方法被調用后因此我們也無法知道它什么時候執行完畢。因此在異步方法前加上返回值是會出問題的。例如:

@Service
public class MyService {
    @Async
    public Integer doA() {
        //doSomething
        return 1;
    }
}
--------------------------------------
public class Test {
    public static void main(String[] args) {
        MyService ms = new MyService();
        System.out.println(ms.doA());    //嘗試調用異步方法 doA 獲得返回值,並輸出
    }
}

這樣是不能正常獲得doA()方法的返回值的,因為在我們輸出doA()的返回值時,doA()甚至可能一行代碼都沒執行完畢。

所以如果異步方法不是void返回類型,為其他返回類型時被調用一律直接返回 null,如果返回類型是基本數據類型由於返回的是 null 則可能拋出裝箱異常。

如果確實需要獲取異步方法的返回值,則需要使用Future類:

@Service
public class MyService {
    @Async
    public Future<Integer> doA() {       //使用Future類接收返回值
        //doSomething
        return 1;
    }
}

Future類的具體用法這里不講。

 

讓方法定時的執行

       要將一個方法變為定時執行,步驟與上面一樣,首先在啟動類上加注解 @EnableScheduling,然后在具體的方法上加上 @Scheduled 注解即可。要使用@Scheduled注解完成目標,主要是要熟練使用注解的參數。

       

 

(圖片來源於葛香東視頻課 《springboot 編寫restful api》)

 

 

 cron是按指定時鍾定時執行,一般需要搭配zone指定時區。

其他三個參數則是方法按指定頻率或間隔執行。

 

cron是一個字符串,用來表示定時執行的具體規則。從左至右分別為 “秒 分 時 日 月 星期幾 年” 年可為空 ,表示任意年。

 

 舉例:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM