摘要:對(duì)于定時(shí)任務(wù)類如果不定義線程池,控制臺(tái)輸出如下,可以看到不同的定時(shí)任務(wù)是同一個(gè)線程在執(zhí)行在配置類或者啟動(dòng)類中增加定時(shí)任務(wù)的線程池控制臺(tái)輸出本節(jié)示例代碼已上傳到
一.SpringBoot中開啟定時(shí)任務(wù)
在spirngboot中使用定時(shí)任務(wù)非常簡單,只需要在啟動(dòng)類上增加一個(gè)@EnableScheduling注解即可。
@SpringBootApplication @EnableScheduling public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
對(duì)定時(shí)任務(wù)的類增加@Component注解,加入Spring的容器管理中
@Component public class ScheduleJob { ...... }
主要有三種定時(shí)的方式:
1.fixedRate
該屬性的含義是上一個(gè)調(diào)用開始后再次調(diào)用的延時(shí)(不用等待上一次調(diào)用完成),這樣就可能會(huì)存在任務(wù)重復(fù)執(zhí)行的問題,所以不是建議使用,但數(shù)據(jù)量如果不大時(shí)在配置的間隔時(shí)間內(nèi)可以執(zhí)行完也是可以使用的。配置示例如下圖5所示:
@Scheduled(fixedRate = 1000 * 1) public void fixedRateTask() throws InterruptedException { TimeUnit.SECONDS.sleep(2); System.out.println("執(zhí)行 fixedRate 任務(wù)的時(shí)間:" + new Date(System.currentTimeMillis())); }
控制臺(tái)輸出:
任務(wù)觸發(fā)的間隔都是2秒,說明該方法并沒有等到執(zhí)行完再開始下次執(zhí)行(如果等待執(zhí)行完應(yīng)該需要3秒),而且看起來像一個(gè)單線程加隊(duì)列的方式在執(zhí)行。
2.fixedDelay
該屬性的功效與上面的fixedRate則是相反的,配置了該屬性后會(huì)等到方法執(zhí)行完成后延遲配置的時(shí)間再次執(zhí)行該方法。
@Scheduled(fixedDelay = 1000 * 1) public void fixedDelayTask() throws InterruptedException { TimeUnit.SECONDS.sleep(3); System.out.println("執(zhí)行 fixedDelay 任務(wù)的時(shí)間:" + new Date(System.currentTimeMillis())); }
控制臺(tái)輸出結(jié)果:
3.cron表達(dá)式
@Scheduled(cron = "0/10 * * * * ?") public void cronTask() { System.out.println("執(zhí)行 cron 任務(wù)的時(shí)間:" + new Date(System.currentTimeMillis())); }
控制臺(tái)輸出:
默認(rèn)情況下,如果什么都不進(jìn)行配置,就會(huì)導(dǎo)致一個(gè)問題,系統(tǒng)中所有的定時(shí)任務(wù)都是使用的一個(gè)線程去執(zhí)行的,也就是說,如果如果同一個(gè)時(shí)刻有2個(gè)定時(shí)任務(wù)需要執(zhí)行,那么只可能有一個(gè)定時(shí)任務(wù)在執(zhí)行,如果要解決這個(gè)問題可以定義一個(gè)自定的任務(wù)調(diào)度線程池即可。
解決方案:
By default, will be searching for an associated scheduler definition: either a unique {@link org.springframework.scheduling.TaskScheduler} bean in the context, or a {@code TaskScheduler} bean named "taskScheduler" otherwise; the same lookup will also be performed for a {@link java.util.concurrent.ScheduledExecutorService} bean. If neither of the two is resolvable, a local single-threaded default scheduler will be created and used within the registrar.
上面這一段是從org.springframework.scheduling.annotation.EnableScheduling這個(gè)注解類上的一段注釋。大致上就是我們定義一個(gè)TaskScheduler類型的bean即可解決這個(gè)問題。
對(duì)于定時(shí)任務(wù)類:
@Component public class ScheduleTreadTest { @Scheduled(cron = "0/3 * * * * ?") public void task01() { System.out.println(Thread.currentThread().getName() + "----> task01"); } @Scheduled(cron = "0/2 * * * * ?") public void task02() { System.out.println(Thread.currentThread().getName() + "----> task02"); } @Scheduled(cron = "0/3 * * * * ?") public void task03() { System.out.println(Thread.currentThread().getName() + "----> task03"); } }
如果不定義線程池,控制臺(tái)輸出如下,可以看到不同的定時(shí)任務(wù)是同一個(gè)線程在執(zhí)行:
在配置類或者啟動(dòng)類中增加定時(shí)任務(wù)的線程池:
控制臺(tái)輸出:
本節(jié)示例代碼已上傳到github: https://github.com/liaosilzu2...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/71043.html
摘要:多線程并發(fā)定時(shí)任務(wù)剛剛看了下實(shí)現(xiàn)定時(shí)任務(wù)的文章,感覺還不錯(cuò)。存在問題但是后來發(fā)現(xiàn)個(gè)問題,通過同時(shí)測試幾個(gè)任務(wù)發(fā)現(xiàn),所有的任務(wù)都是在同一個(gè)線程池中的同一個(gè)線程來完成的。 spring-boot | 多線程并發(fā)定時(shí)任務(wù) 剛剛看了下Spring Boot實(shí)現(xiàn)定時(shí)任務(wù)的文章,感覺還不錯(cuò)。Spring Boot 使用Spring自帶的Schedule來實(shí)現(xiàn)定時(shí)任務(wù)變得非常簡單和方便。在這里個(gè)大家...
摘要:當(dāng)前時(shí)間打印當(dāng)前時(shí)間定時(shí)任務(wù)觸發(fā),操作多個(gè)添加數(shù)據(jù),事務(wù)中任一異常,都可以正常導(dǎo)致數(shù)據(jù)回滾。當(dāng)前時(shí)間當(dāng)前時(shí)間添加微服務(wù)啟動(dòng)類注解式配置定時(shí)任務(wù),不支持任務(wù)調(diào)度。 SpringCloud(第 046 篇)注解式Schedule配置定時(shí)任務(wù),不支持任務(wù)調(diào)度 - 一、大致介紹 1、很多時(shí)候我們需要隔一定的時(shí)間去執(zhí)行某個(gè)任務(wù),為了實(shí)現(xiàn)這樣的需求通常最普通的方式就是利用多線程來實(shí)現(xiàn); 2、但是有...
摘要:前情提要由于項(xiàng)目需要,需要一個(gè)定時(shí)任務(wù)集群,故此有了這個(gè)集群的實(shí)踐。數(shù)據(jù)庫表前綴在被認(rèn)為失火之前,調(diào)度程序?qū)⑷萑桃粋€(gè)將其下一個(gè)啟動(dòng)時(shí)間通過的毫秒數(shù)。設(shè)置此實(shí)例檢入與群集的其他實(shí)例的頻率以毫秒為單位。影響檢測失敗實(shí)例的速度。 【前情提要】由于項(xiàng)目需要,需要一個(gè)定時(shí)任務(wù)集群,故此有了這個(gè)spring-boot-starter-quartz集群的實(shí)踐。springboot的版本為:2.1.6...
本文將告訴你如何使用spring的任務(wù)調(diào)度。主要使用@Scheduled注解 需要會(huì)使用maven 第一步 pom.xml配置 4.0.0 org.xxz scheduled-task-test 1.0 org.springframework.boot spring-boot-starter-parent ...
摘要:時(shí)間年月日星期四說明本文部分內(nèi)容均來自慕課網(wǎng)。哈希表實(shí)現(xiàn)命令,將哈希表中的域的值設(shè)為實(shí)現(xiàn)命令,返回哈希表中給定域的值實(shí)現(xiàn)命令,刪除哈希表中的一個(gè)或多個(gè)指定域,不存在的域?qū)⒈缓雎?。?shí)現(xiàn)命令,返回哈希表中,所有的域和值。 時(shí)間:2018年04月19日星期四說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):https://www.imooc.com教學(xué)源碼:https://github.com/zc...
閱讀 2122·2023-04-26 00:41
閱讀 1155·2021-09-24 10:34
閱讀 3585·2021-09-23 11:21
閱讀 4116·2021-09-22 15:06
閱讀 1567·2019-08-30 15:55
閱讀 908·2019-08-30 15:54
閱讀 1836·2019-08-30 15:48
閱讀 561·2019-08-29 13:58