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