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

SpringBoot定時(shí)任務(wù)+自定義線程池實(shí)踐

 更新時(shí)間:2026年05月08日 16:39:36   作者:god-jiang  
文章介紹了SpringBoot中使用@Schedule注解實(shí)現(xiàn)定時(shí)任務(wù)的方法,包括四種定時(shí)任務(wù)格式和Cron表達(dá)式,同時(shí),還探討了@Schedule默認(rèn)線程池大小為1的情況及解決方案,即通過(guò)@Async注解實(shí)現(xiàn)異步處理和手動(dòng)實(shí)現(xiàn)自定義線程池進(jìn)行優(yōu)化

背景

在真實(shí)的Java開(kāi)發(fā)環(huán)境中,我們經(jīng)常會(huì)需要用到定時(shí)任務(wù)來(lái)幫助我們完成一些特殊的任務(wù),比如我最近寫的晚上11點(diǎn)定時(shí)拉取第三方的數(shù)據(jù)入庫(kù),晚上12點(diǎn)清理臟數(shù)據(jù)等等。

如果我們使用SpringBoot來(lái)開(kāi)發(fā),那么定時(shí)任務(wù)將會(huì)變得非常簡(jiǎn)單。SpringBoot默認(rèn)已經(jīng)幫我們封裝好了相關(guān)定時(shí)任務(wù)的組件和配置,我們只需要在相應(yīng)的地方加上@Schedule注解就可以實(shí)現(xiàn)定時(shí)任務(wù)。

啟動(dòng)定時(shí)任務(wù)

SpringBoot項(xiàng)目只需要在啟動(dòng)類上加上@EnableScheduling即可開(kāi)啟定時(shí)任務(wù)

@SpringBootApplication
@EnableScheduling
public class ScheduleTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(ScheduleTestApplication.class, args);
    }

}

創(chuàng)建定時(shí)任務(wù)

SpringBoot的Scheduler支持四種定時(shí)任務(wù)格式

  • fixedRate:固定速率執(zhí)行,例如每3秒執(zhí)行一次
  • fixedDelay:固定延遲執(zhí)行,例如距離上一次調(diào)用成功后3秒執(zhí)行
  • initialDelay:初始延遲任務(wù),例如任務(wù)開(kāi)啟過(guò)3秒后再執(zhí)行,之后以固定頻率或者間隔執(zhí)行
  • cron:使用 Cron 表達(dá)式執(zhí)行定時(shí)任務(wù)

以上在企業(yè)開(kāi)發(fā)中經(jīng)常用到的是cron表達(dá)式,可以說(shuō)掌握了cron表達(dá)式,基本就掌握了SpringBoot的定時(shí)任務(wù)了。

使用cron表達(dá)式

@Component
public class ScheduleTask {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    //每隔5秒執(zhí)行一次該方法
    @Scheduled(cron = "*/5 * * * * ?")
    public void testScheduleTask() {
        System.out.println("SpringBoot的定時(shí)任務(wù)" + Thread.currentThread().getName() + sdf.format(new Date()));
    }

}

@Schedule默認(rèn)線程池大小

其實(shí)@Schedule默認(rèn)線程池大小為1,我們可以下面的實(shí)驗(yàn)得出這個(gè)結(jié)論。

@Component
public class ScheduleTask {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    //固定2秒執(zhí)行一次該方法
    @Scheduled(fixedRate = 2000)
    public void testScheduleTask() {
        try{
            Thread.sleep(6000);
            System.out.println("SpringBoot的定時(shí)任務(wù)" + Thread.currentThread().getName() + sdf.format(new Date()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

結(jié)果每隔6秒執(zhí)行一次,可以看到線程的名字為scheduleing-12021-01-12,表示都是用的同一個(gè)線程,默認(rèn)@Schedule是開(kāi)啟一個(gè)線程。

一般情況下使用默認(rèn)@Schedule沒(méi)有問(wèn)題,但是如果有多個(gè)定時(shí)任務(wù),每個(gè)定時(shí)任務(wù)執(zhí)行時(shí)間可能不短的情況下,會(huì)有可能出現(xiàn)定時(shí)任務(wù)一直沒(méi)有機(jī)會(huì)執(zhí)行的情況。

異步執(zhí)行定時(shí)任務(wù)

給該方法加上@Async進(jìn)行異步處理,看看會(huì)是什么效果~

@Component
@EnableAsync
public class ScheduleTask {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Async
    @Scheduled(fixedRate = 2000)
    public void testScheduleTask() {
        try{
            Thread.sleep(6000);
            System.out.println("SpringBoot的定時(shí)任務(wù)" + Thread.currentThread().getName() + sdf.format(new Date()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

可以看出線程的名字都是不一樣的,然后每隔2秒的執(zhí)行一次該方法,異步處理不受方法內(nèi)的時(shí)間影響,并行執(zhí)行。

手動(dòng)實(shí)現(xiàn)自定義任務(wù)線程池

雖然可以用SpringBoot提供給我們的異步注解@Async處理,但是我們開(kāi)發(fā)者也可以手動(dòng)實(shí)現(xiàn)一個(gè)線程池,更好的配置和使用我們的異步處理。

@Component
public class AsyncScheduledTaskConfig {

    @Bean
    public Executor myAsync() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        //最大線程數(shù)
        executor.setMaxPoolSize(100);
        //核心線程數(shù)
        executor.setCorePoolSize(10);
        //任務(wù)隊(duì)列的大小
        executor.setQueueCapacity(10);
        //線程前綴名
        executor.setThreadNamePrefix("god-jiang-");
        //線程存活時(shí)間
        executor.setKeepAliveSeconds(30);

        /**
         * 拒絕處理策略
         * CallerRunsPolicy():交由調(diào)用方線程運(yùn)行,比如 main 線程。
         * AbortPolicy():直接拋出異常。
         * DiscardPolicy():直接丟棄。
         * DiscardOldestPolicy():丟棄隊(duì)列中最老的任務(wù)。
         */
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
        //線程初始化
        executor.initialize();
        return executor;
    }
}

使用自定義的線程池實(shí)現(xiàn)異步處理

@Component
@EnableAsync
public class ScheduleTask {

    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Async("myAsync")
    @Scheduled(fixedRate = 2000)
    public void testScheduleTask() {
        try{
            Thread.sleep(6000);
            System.out.println("SpringBoot的定時(shí)任務(wù)" + Thread.currentThread().getName() + sdf.format(new Date()));
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}

當(dāng)前線程名稱已經(jīng)被改成自定義god-jiang-的前綴!自定義線程池可以方便我們的項(xiàng)目更好的運(yùn)行,同時(shí)也要設(shè)置前綴名字,方便出問(wèn)題的時(shí)候我們可以排查是哪一個(gè)線程出的問(wèn)題~~~

總結(jié)

以上就是我在企業(yè)開(kāi)發(fā)中所用到的SpringBoot的@Schedule定時(shí)任務(wù),并且搭配上我手動(dòng)實(shí)現(xiàn)的線程池異步執(zhí)行,基本可以滿足絕大部分的開(kāi)發(fā)需求。

這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java數(shù)組常見(jiàn)應(yīng)用詳解【創(chuàng)建、遍歷、排序、查找】

    Java數(shù)組常見(jiàn)應(yīng)用詳解【創(chuàng)建、遍歷、排序、查找】

    這篇文章主要介紹了Java數(shù)組常見(jiàn)應(yīng)用,結(jié)合實(shí)例形式詳細(xì)分析了java數(shù)組的基本定義、創(chuàng)建、遍歷、排序、查找等相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • Redis使用RedisTemplate模板類的常用操作方式

    Redis使用RedisTemplate模板類的常用操作方式

    這篇文章主要介紹了Redis使用RedisTemplate模板類的常用操作方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java實(shí)現(xiàn)CSV 字段分割

    java實(shí)現(xiàn)CSV 字段分割

    這篇文章主要介紹了java實(shí)現(xiàn)CSV 字段分割的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • IntelliJ IDEA使用快捷鍵重命名項(xiàng)目、變量、文件等方法總結(jié)

    IntelliJ IDEA使用快捷鍵重命名項(xiàng)目、變量、文件等方法總結(jié)

    今天小編就為大家分享一篇關(guān)于IntelliJ IDEA使用快捷鍵重命名項(xiàng)目、變量、文件等方法總結(jié),小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-10-10
  • SpringBoot集成RocketMQ事務(wù)消息的完整指南

    SpringBoot集成RocketMQ事務(wù)消息的完整指南

    事務(wù)消息是?RocketMQ?提供的一種高級(jí)消息類型,用于解決分布式場(chǎng)景下,本地?cái)?shù)據(jù)庫(kù)事務(wù)與消息發(fā)送之間的一致性問(wèn)題,下面小編就來(lái)和大家聊聊SpringBoot集成RocketMQ事務(wù)消息的完整方法吧
    2025-10-10
  • JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究

    JavaWeb Servlet生命周期細(xì)枝末節(jié)處深究

    Servlet指在服務(wù)器端執(zhí)行的一段Java代碼,可以接收用戶的請(qǐng)求和返回給用戶響應(yīng)結(jié)果,下面這篇文章主要給大家介紹了關(guān)于JavaWeb.servlet生命周期的相關(guān)資料,需要的朋友可以參考下
    2022-10-10
  • Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解

    這篇文章主要介紹了Java中的String、StringBuilder、StringBuffer三者的區(qū)別詳解,就是String,StringBuilder以及StringBuffer這三個(gè)類之間有什么區(qū)別呢,自己從網(wǎng)上搜索了一些資料,有所了解了之后在這里整理一下,便于大家觀看,需要的朋友可以參考下
    2023-12-12
  • Java?處理樹(shù)形結(jié)構(gòu)數(shù)據(jù)的過(guò)程

    Java?處理樹(shù)形結(jié)構(gòu)數(shù)據(jù)的過(guò)程

    這篇文章主要介紹了Java?處理樹(shù)形結(jié)構(gòu)數(shù)據(jù)的過(guò)程,本文給大家分析具體實(shí)現(xiàn)過(guò)程,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-08-08
  • Mybatis?SqlSession案例詳解

    Mybatis?SqlSession案例詳解

    這篇文章主要介紹了Mybatis?SqlSession詳解,本文我們講了如何創(chuàng)建SqlSession的幾個(gè)步驟,最后我們獲得一個(gè)DefaultSqlSession對(duì)象,里面包含了執(zhí)行器Executor和配置對(duì)象Configuration,需要的朋友可以參考下
    2023-04-04
  • Java中JWT令牌實(shí)現(xiàn)登錄驗(yàn)證

    Java中JWT令牌實(shí)現(xiàn)登錄驗(yàn)證

    本文主要介紹了JWT令牌在Java中實(shí)現(xiàn)登錄驗(yàn)證的方法,JWT是一種自我包含的、無(wú)狀態(tài)的認(rèn)證機(jī)制,可以用來(lái)在客戶端和服務(wù)器之間傳遞安全可靠的信息,感興趣的可以了解一下
    2024-12-12

最新評(píng)論

沁水县| 岳普湖县| 左云县| 郎溪县| 宝应县| 茌平县| 绍兴县| 景宁| 和政县| 固原市| 和龙市| 饶河县| 梨树县| 繁峙县| 佛山市| 富顺县| 兴国县| 衡东县| 朝阳县| 体育| 彭水| 治多县| 共和县| 大丰市| 涞水县| 常山县| 安乡县| 资讯 | 青神县| 长治市| 富阳市| 南郑县| 隆化县| 巴彦淖尔市| 庆安县| 金平| 毕节市| 托克逊县| 东明县| 旬邑县| 崇信县|