最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot使用@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)的并行執(zhí)行

 更新時(shí)間:2024年06月02日 15:37:02   作者:シ風(fēng)箏  
在SpringBoot中,如果使用@Scheduled注解來(lái)定義多個(gè)定時(shí)任務(wù),默認(rèn)情況下這些任務(wù)將會(huì)被安排在一個(gè)單線程的調(diào)度器中執(zhí)行,這意味著,這些任務(wù)將會(huì)串行執(zhí)行,而不是并行執(zhí)行,本文介紹了SpringBoot使用@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)的并行執(zhí)行,需要的朋友可以參考下

引言

在SpringBoot中,如果使用@Scheduled注解來(lái)定義多個(gè)定時(shí)任務(wù),默認(rèn)情況下這些任務(wù)將會(huì)被安排在一個(gè)單線程的調(diào)度器中執(zhí)行。這意味著,這些任務(wù)將會(huì)串行執(zhí)行,而不是并行執(zhí)行。當(dāng)一個(gè)任務(wù)正在執(zhí)行時(shí),其他被觸發(fā)的任務(wù)將會(huì)等待當(dāng)前任務(wù)完成后再開始執(zhí)行,這可能導(dǎo)致任務(wù)執(zhí)行上的阻塞,特別是當(dāng)某個(gè)任務(wù)執(zhí)行時(shí)間較長(zhǎng)時(shí),可能會(huì)延遲后續(xù)任務(wù)的啟動(dòng)時(shí)間,影響定時(shí)任務(wù)的準(zhǔn)時(shí)性。

1.問題代碼及測(cè)試結(jié)果

問題代碼:

    @Scheduled(cron = "*/1 * * * * *")
    public void a() throws InterruptedException {
        log.info("A Start {}!", System.currentTimeMillis());
        Thread.sleep(2000);
        log.info("A End {}!", System.currentTimeMillis());
    }

    @Scheduled(cron = "*/1 * * * * *")
    public void b() {
        log.info("B Start {}!", System.currentTimeMillis());
        log.info("B End {}!", System.currentTimeMillis());
    }

部分測(cè)試結(jié)果:

15:38:29.001 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716968309001!
15:38:29.001 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716968309001!
15:38:29.001 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716968309001!

15:38:31.003 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [a,46] - A End 1716968311003!
15:38:31.003 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716968311003!
15:38:31.003 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716968311003!

15:38:32.002 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716968312002!

15:38:34.003 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [a,46] - A End 1716968314003!
15:38:34.003 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716968314003!
15:38:34.003 [scheduling-1] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716968314003!

結(jié)果分析:

  • A和B是串行的。

2.定時(shí)任務(wù)實(shí)現(xiàn)并行

2.1 使用自定義線程池(添加類)

可以通過配置一個(gè)自定義的TaskScheduler或者ThreadPoolTaskScheduler來(lái)為@Scheduled任務(wù)提供一個(gè)線程池,從而允許多個(gè)任務(wù)并行執(zhí)行。例如,可以在配置類中定義一個(gè)ThreadPoolTaskScheduler Bean:

@Configuration
public class AsyncConfig {
    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        // 設(shè)置線程池大小
        scheduler.setPoolSize(10); 
        scheduler.setThreadNamePrefix("my-scheduled-task-");
        return scheduler;
    }
}

并確保你的配置類被掃描到,且在@EnableScheduling注解的上下文中。

測(cè)試代碼:

    @Scheduled(cron = "*/1 * * * * *")
    public void a() throws InterruptedException {
        log.info("A Start {}!", System.currentTimeMillis());
        Thread.sleep(2000);
        log.info("A End {}!", System.currentTimeMillis());
    }

    @Scheduled(cron = "*/1 * * * * *")
    public void b() {
        log.info("B Start {}!", System.currentTimeMillis());
        log.info("B End {}!", System.currentTimeMillis());
    }

部分測(cè)試結(jié)果:

15:16:18.003 [my-scheduled-task-2] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716966978003!
15:16:18.003 [my-scheduled-task-1] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716966978003!
15:16:18.003 [my-scheduled-task-1] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716966978003!

15:16:19.002 [my-scheduled-task-1] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716966979002!
15:16:19.002 [my-scheduled-task-1] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716966979002!

15:16:20.004 [my-scheduled-task-2] INFO  c.x.e.m.SchedulerTask - [a,46] - A End 1716966980004!
15:16:20.004 [my-scheduled-task-3] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716966980004!
15:16:20.004 [my-scheduled-task-3] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716966980004!

15:16:21.003 [my-scheduled-task-1] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716966981003!
15:16:21.003 [my-scheduled-task-4] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716966981003!
15:16:21.003 [my-scheduled-task-4] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716966981003!

15:16:22.001 [my-scheduled-task-2] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716966982001!
15:16:22.001 [my-scheduled-task-2] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716966982001!

15:16:23.004 [my-scheduled-task-1] INFO  c.x.e.m.SchedulerTask - [a,46] - A End 1716966983004!
15:16:23.004 [my-scheduled-task-3] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716966983004!
15:16:23.004 [my-scheduled-task-3] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716966983004!

結(jié)果分析:

  • A和B是并行的;
  • A和A或者B和B是串行的。

2.2 使用異步處理(添加類和注解)

結(jié)合@Async注解和@EnableAsync可以使得每個(gè)@Scheduled任務(wù)在獨(dú)立的線程中異步執(zhí)行。
首先需要在配置類中啟用異步支持,并配置一個(gè)線程池,然后在每個(gè)定時(shí)任務(wù)方法上添加@Async注解。

@EnableAsync
@Configuration
public class AsyncConfig {
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(200);
        executor.setThreadNamePrefix("Async-");
        executor.initialize();
        return executor;
    }
}

測(cè)試代碼:

    @Async
    @Scheduled(cron = "*/1 * * * * *")
    public void a() throws InterruptedException {
        log.info("A Start {}!", System.currentTimeMillis());
        Thread.sleep(2000);
        log.info("A End {}!", System.currentTimeMillis());
    }

    @Async
    @Scheduled(cron = "*/1 * * * * *")
    public void b() {
        log.info("B Start {}!", System.currentTimeMillis());
        log.info("B End {}!", System.currentTimeMillis());
    }

部分測(cè)試結(jié)果:

15:26:52.008 [Async-2] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716967612008!
15:26:52.008 [Async-1] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716967612008!
15:26:52.009 [Async-1] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716967612009!

15:26:53.002 [Async-4] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716967613002!
15:26:53.002 [Async-3] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716967613002!
15:26:53.002 [Async-3] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716967613002!

15:26:54.001 [Async-6] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716967614001!
15:26:54.001 [Async-5] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716967614001!
15:26:54.001 [Async-5] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716967614001!
15:26:54.010 [Async-2] INFO  c.x.e.m.SchedulerTask - [a,46] - A End 1716967614010!

15:26:55.002 [Async-8] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716967615002!
15:26:55.002 [Async-7] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716967615002!
15:26:55.002 [Async-7] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716967615002!
15:26:55.002 [Async-4] INFO  c.x.e.m.SchedulerTask - [a,46] - A End 1716967615002!

15:26:56.001 [Async-10] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716967616001!
15:26:56.001 [Async-9] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716967616001!
15:26:56.001 [Async-9] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716967616001!
15:26:56.002 [Async-6] INFO  c.x.e.m.SchedulerTask - [a,46] - A End 1716967616002!

15:26:57.001 [Async-3] INFO  c.x.e.m.SchedulerTask - [a,44] - A Start 1716967617001!
15:26:57.001 [Async-1] INFO  c.x.e.m.SchedulerTask - [b,52] - B Start 1716967617001!
15:26:57.001 [Async-1] INFO  c.x.e.m.SchedulerTask - [b,53] - B End 1716967617001!
15:26:57.002 [Async-8] INFO  c.x.e.m.SchedulerTask - [a,46] - A End 1716967617002!

測(cè)試結(jié)果分析:

  • A和B是并行的;
  • A和A或者B和B也是并行的。

3.總結(jié)

到此這篇關(guān)于SpringBoot使用@Scheduled實(shí)現(xiàn)定時(shí)任務(wù)的并行執(zhí)行的文章就介紹到這了,更多相關(guān)SpringBoot @Scheduled任務(wù)并行執(zhí)行內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring?c3p0配置的實(shí)現(xiàn)示例

    Spring?c3p0配置的實(shí)現(xiàn)示例

    在Spring框架中配置c3p0連接池可以提升數(shù)據(jù)庫(kù)操作性能,本文主要介紹了Spring?c3p0配置的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-09-09
  • 基于Java解決華為機(jī)試之字符串加解密?

    基于Java解決華為機(jī)試之字符串加解密?

    這篇文章主要介紹了基于Java解決華為機(jī)試之字符串加解密,問題描述展開主題即詳細(xì)代碼的分享完成文章內(nèi)容,具有一的的參考價(jià)值,需要的小伙伴可以參考一下。希望對(duì)你有所幫助
    2022-02-02
  • 詳談java 堆區(qū)、方法區(qū)和棧區(qū)

    詳談java 堆區(qū)、方法區(qū)和棧區(qū)

    下面小編就為大家?guī)?lái)一篇詳談java 堆區(qū)、方法區(qū)和棧區(qū)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-05-05
  • SpringBoot實(shí)現(xiàn)微信掃碼登錄的示例代碼

    SpringBoot實(shí)現(xiàn)微信掃碼登錄的示例代碼

    本文主要介紹了SpringBoot實(shí)現(xiàn)微信掃碼登錄的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • Java利用POI讀寫Excel文件工具類

    Java利用POI讀寫Excel文件工具類

    這篇文章主要為大家詳細(xì)介紹了Java利用POI讀寫Excel文件的工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 詳解Spring連接數(shù)據(jù)庫(kù)的幾種常用的方式

    詳解Spring連接數(shù)據(jù)庫(kù)的幾種常用的方式

    本篇文章主要介紹了Spring連接數(shù)據(jù)庫(kù)的幾種常用的方式,具有一定的參考價(jià)值,有需要的可以了解一下。
    2016-12-12
  • JavaWeb實(shí)現(xiàn)文件的上傳與下載

    JavaWeb實(shí)現(xiàn)文件的上傳與下載

    這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)文件的上傳與下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • Java網(wǎng)絡(luò)編程中的TCP/UDP詳解

    Java網(wǎng)絡(luò)編程中的TCP/UDP詳解

    這篇文章主要介紹了Java網(wǎng)絡(luò)編程中的TCP/UDP詳解,網(wǎng)絡(luò)編程是指編寫運(yùn)行在多個(gè)設(shè)備的程序,這些設(shè)備都通過網(wǎng)絡(luò)連接起來(lái),java.net 包中 J2SE 的 API 包含有類和接口,它們提供低層次的通信細(xì)節(jié),需要的朋友可以參考下
    2023-12-12
  • Spring AOP實(shí)現(xiàn)復(fù)雜的日志記錄操作(自定義注解)

    Spring AOP實(shí)現(xiàn)復(fù)雜的日志記錄操作(自定義注解)

    Spring AOP實(shí)現(xiàn)復(fù)雜的日志記錄操作(自定義注解),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Android、iOS和Java通用的AES128加密解密示例代碼

    Android、iOS和Java通用的AES128加密解密示例代碼

    現(xiàn)在很多App在與服務(wù)器接口的請(qǐng)求和響應(yīng)過程中,為了安全都會(huì)涉及到加密和解密的問題,如果不加的話就會(huì)是明文的,即使加了GZIP也可以被直接解壓成明文。如果同時(shí)有Android和IOS的App的話、必須要保證加密和解密的算法一致、不然后臺(tái)沒法處理,下面通過這篇文章學(xué)習(xí)下。
    2016-11-11

最新評(píng)論

齐齐哈尔市| 西青区| 辽阳县| 彭阳县| 皋兰县| 平舆县| 罗定市| 铁岭市| 满城县| 黔西| 平武县| 新蔡县| 万山特区| 榆中县| 鹤山市| 乌审旗| 广丰县| 铜鼓县| 长顺县| 正定县| 北海市| 凤山县| 樟树市| 天柱县| 梅河口市| 山东省| 弥渡县| 鞍山市| 马尔康县| 甘南县| 二连浩特市| 文安县| 建瓯市| 珠海市| 益阳市| 常宁市| 原阳县| 松滋市| 海安县| 腾冲县| 茶陵县|