java中多個@Scheduled定時器不執(zhí)行的解決方法
項(xiàng)目背景:在項(xiàng)目中包含兩個定時任務(wù),配置信息如下:
1、@Scheduled(initialDelay = 1,fixedDelay=10000)
public voud aa(){}
1、@Scheduled(initialDelay = 1,fixedDelay=10000)
public voud bb(){}
我們需要的都是項(xiàng)目啟動后,同時調(diào)用執(zhí)行aa 和bb 方法,我們發(fā)現(xiàn)只能執(zhí)行其中一個!那么如何解決呢?
原因是:@Scheduled注解會在默認(rèn)情況下以單線程的方式執(zhí)行定時任務(wù)。
這個“單線程”指兩個方面:
如果一個定時任務(wù)執(zhí)行時間大于其任務(wù)間隔時間,那么下一次將會等待上一次執(zhí)行結(jié)束后再繼續(xù)執(zhí)行。
如果多個定時任務(wù)在同一時刻執(zhí)行,任務(wù)會依次執(zhí)行。
我們項(xiàng)目都是配置了initialDelay =1 ,Scheduled啟動一個的時候,另外一個根本得不到執(zhí)行!當(dāng)然fixedDelay是可以正常按照執(zhí)行間隔來執(zhí)行的,就是首次執(zhí)行收到影響!
為了讓@Scheduled效率更高,我們可以通過兩種方法將定時任務(wù)變成多線程執(zhí)行::
方法1、在啟動類中配置TaskScheduler線程池大小
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(10);//不配置默認(rèn)是1
return taskScheduler;
}
方法2、利用Spring提供的@Async注解和@EnableAsync注解
@Component
@EnableAsync
public class TimedTask{
@Async
@Scheduled(initialDelay = 1,fixedDelay=10000)
public void aa() {
//執(zhí)行你的業(yè)務(wù)邏輯
}
@Async
@Scheduled(initialDelay = 1,fixedDelay=10000)
public void bb() {
//執(zhí)行你的業(yè)務(wù)邏輯
}
總結(jié)
到此這篇關(guān)于java中多個@Scheduled定時器不執(zhí)行的文章就介紹到這了,更多相關(guān)java多個@Scheduled定時器不執(zhí)行內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
教你如何用Jenkins自動化部署項(xiàng)目(從零到搭建完成)
這篇文章主要介紹了教你如何用Jenkins自動化部署項(xiàng)目(從零到搭建完成),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
linux系統(tǒng)下java項(xiàng)目在后臺啟動的4種方式總結(jié)
Linux是集多種功能于一身的操作系統(tǒng),它可以讓用戶查看和管理當(dāng)下正在運(yùn)行的進(jìn)程,包括Java程序,這篇文章主要給大家總結(jié)介紹了關(guān)于linux系統(tǒng)下java項(xiàng)目在后臺啟動的4種方式,需要的朋友可以參考下2023-10-10
Java內(nèi)存模型之happens-before概念詳解
happens-before原則非常重要,它是判斷數(shù)據(jù)是否存在競爭、線程是否安全的主要依據(jù),依靠這個原則,我們解決在并發(fā)環(huán)境下兩操作之間是否可能存在沖突的所有問題。下面我們就一個簡單的例子稍微了解下happens-before知識,感興趣的朋友一起看看吧2021-06-06

