@Schedule?如何解決定時任務推遲執(zhí)行
前言
SpringBoot 實現(xiàn)定時任務很簡單,只需要使用**@Scheduled**注解即可,但是該注解是實現(xiàn)的定時任務默認是單線程的,也就意味著多個定時任務執(zhí)行時就可能導致線程堵塞,延緩定時任務的執(zhí)行。
下面就一步一步來解決這個問題。
一、@Scheduled
1、代碼
// 啟用定時任務
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@Component
public class Task {
Logger logger = LoggerFactory.getLogger(Task.class);
// 每五秒執(zhí)行一次
@Scheduled(cron = "0/5 * * * * ?")
public void taskTestA() throws InterruptedException {
logger.info("A:");
TimeUnit.SECONDS.sleep(20);
}
// 每十秒執(zhí)行一次
@Scheduled(cron = "0/10 * * * * ?")
public void taskTestB() {
logger.info("B:");
}
}
2、結果

由圖可知,首先這兩個定時任務都是單線程的,但是當定時A執(zhí)行了一次后,由于定時A中有個休眠20秒,然后執(zhí)行定時任務B,所以線程A第二次執(zhí)行在25秒后才執(zhí)行,這就是由于@Scheduled定時任務是單線程,造成的線程堵塞,導致定時任務推遲執(zhí)行。
二、@Scheduled + 配置線程池
1、代碼
和前面@Scheduled 相比,僅僅增加了配置線程池
// 若不設置默認為單線程,這里設置使用線程池,大小為4
spring:
task:
scheduling:
pool:
size: 42、結果

由圖可知,增加了線程池,這樣使得定時任務A和B在不同的線程進行執(zhí)行,但是定時任務A的第二次執(zhí)行,依舊是在25秒后執(zhí)行,由此可知這種方式其實解決的是不同定時任務之間的進程堵塞。
三、@Scheduled + @Async
1、代碼
和前面相比,僅僅增加了配置
// 啟用異步,動態(tài)創(chuàng)建線程
@EnableAsync
@EnableScheduling
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}@Component
public class Task {
Logger logger = LoggerFactory.getLogger(Task.class);
// 異步,動態(tài)創(chuàng)建線程
@Async
@Scheduled(cron = "0/5 * * * * ?")
public void taskTestA() throws InterruptedException {
logger.info("A:");
TimeUnit.SECONDS.sleep(20);
}
// 異步,動態(tài)創(chuàng)建線程
@Async
@Scheduled(cron = "0/10 * * * * ?")
public void taskTestB() {
logger.info("B:");
}
}2、結果

由圖可知,啟用了異步,使用了spring 默認的線程池,動態(tài)創(chuàng)建線程,這樣使得定時任務A和B在不同的線程進行執(zhí)行,同時任務A的多次運行也是異步執(zhí)行,這樣就能確保所有定時任務不會延遲執(zhí)行!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
java ArrayBlockingQueue阻塞隊列的實現(xiàn)示例
ArrayBlockingQueue是一個基于數(shù)組實現(xiàn)的阻塞隊列,本文就來介紹一下java ArrayBlockingQueue阻塞隊列的實現(xiàn)示例,具有一定的參考價值,感興趣的可以了解一下2024-02-02
SpringBoot如何使用MyBatisPlus逆向工程自動生成代碼
本文介紹如何使用SpringBoot、MyBatis-Plus進行逆向工程自動生成代碼,并結合Swagger3.0實現(xiàn)API文檔的自動生成和訪問,通過詳細步驟和配置,確保Swagger與SpringBoot版本兼容,并通過配置文件和測試類實現(xiàn)代碼生成和Swagger文檔的訪問2024-12-12
java8 利用reduce實現(xiàn)將列表中的多個元素的屬性求和并返回操作
這篇文章主要介紹了java8 利用reduce實現(xiàn)將列表中的多個元素的屬性求和并返回操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-08-08

