1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Spring Boot 如何解決多個(gè)定時(shí)任務(wù)阻塞問題?

        共 2253字,需瀏覽 5分鐘

         ·

        2022-01-14 07:32

        點(diǎn)擊關(guān)注公眾號(hào),Java干貨及時(shí)送達(dá)??

        今天這篇文章介紹一下Spring Boot 中 如何開啟多線程定時(shí)任務(wù)?

        為什么Spring Boot 定時(shí)任務(wù)是單線程的?

        想要解釋為什么,一定要從源碼入手,直接從@EnableScheduling這個(gè)注解入手,找到了這個(gè)ScheduledTaskRegistrar類,其中有一段代碼如下:

        protected?void?scheduleTasks()?{
        ??if?(this.taskScheduler?==?null)?{
        ???this.localExecutor?=?Executors.newSingleThreadScheduledExecutor();
        ???this.taskScheduler?=?new?ConcurrentTaskScheduler(this.localExecutor);
        ??}
        }

        如果taskSchedulernull,則創(chuàng)建單線程的線程池:Executors.newSingleThreadScheduledExecutor()。

        多線程定時(shí)任務(wù)如何配置?

        下面介紹三種方案配置多線程下的定時(shí)任務(wù)。

        1、重寫SchedulingConfigurer#configureTasks()

        直接實(shí)現(xiàn)SchedulingConfigurer這個(gè)接口,設(shè)置taskScheduler,代碼如下:

        @Configuration
        public?class?ScheduleConfig?implements?SchedulingConfigurer?{
        ????@Override
        ????public?void?configureTasks(ScheduledTaskRegistrar?taskRegistrar)?{
        ????????//設(shè)定一個(gè)長度10的定時(shí)任務(wù)線程池
        ????????taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
        ????}
        }

        2、通過配置開啟

        Spring Boot quartz 已經(jīng)提供了一個(gè)配置用來配置線程池的大小,如下;

        spring.task.scheduling.pool.size=10

        只需要在配置文件中添加如上的配置即可生效!

        3、結(jié)合@Async

        @Async這個(gè)注解都用過,用來開啟異步任務(wù)的,使用@Async這個(gè)注解之前一定是要先配置線程池的,配置如下:

        ????@Bean
        ????public?ThreadPoolTaskExecutor?taskExecutor()?{
        ????????ThreadPoolTaskExecutor?poolTaskExecutor?=?new?ThreadPoolTaskExecutor();
        ????????poolTaskExecutor.setCorePoolSize(4);
        ????????poolTaskExecutor.setMaxPoolSize(6);
        ????????//?設(shè)置線程活躍時(shí)間(秒)
        ????????poolTaskExecutor.setKeepAliveSeconds(120);
        ????????//?設(shè)置隊(duì)列容量
        ????????poolTaskExecutor.setQueueCapacity(40);
        ????????poolTaskExecutor.setRejectedExecutionHandler(new?ThreadPoolExecutor.CallerRunsPolicy());
        ????????//?等待所有任務(wù)結(jié)束后再關(guān)閉線程池
        ????????poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
        ????????return?poolTaskExecutor;
        ????}

        然后在@Scheduled方法上標(biāo)注@Async這個(gè)注解即可實(shí)現(xiàn)多線程定時(shí)任務(wù),代碼如下:

        ?@Async
        ????@Scheduled(cron?=?"0/2?*?*?*?*???")
        ????public?void?test2()?{
        ????????System.out.println("..................執(zhí)行test2.................");
        ????}

        總結(jié)

        本篇文章介紹了Spring Boot 中 實(shí)現(xiàn)多線程定時(shí)任務(wù)的三種方案,你喜歡哪一種?

        1.?西安一碼通兩次崩潰,技術(shù)原因是什么?

        2.?支付寶架構(gòu)師眼中的高并發(fā)架構(gòu),真是絕了!

        3.?面試官:TCP為什么要三次握手與四次分手?

        4.?Redis 存儲(chǔ)結(jié)構(gòu)體信息,選 hash 還是string?

        最近面試BAT,整理一份面試資料Java面試BATJ通關(guān)手冊,覆蓋了Java核心技術(shù)、JVM、Java并發(fā)、SSM、微服務(wù)、數(shù)據(jù)庫、數(shù)據(jù)結(jié)構(gòu)等等。

        獲取方式:點(diǎn)“在看”,關(guān)注公眾號(hào)并回復(fù)?Java?領(lǐng)取,更多內(nèi)容陸續(xù)奉上。

        PS:因公眾號(hào)平臺(tái)更改了推送規(guī)則,如果不想錯(cuò)過內(nèi)容,記得讀完點(diǎn)一下在看,加個(gè)星標(biāo),這樣每次新文章推送才會(huì)第一時(shí)間出現(xiàn)在你的訂閱列表里。

        點(diǎn)“在看”支持一下吧??!

        瀏覽 96
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            夜夜久久 | 91在线无码精品秘 入口九色十 | 男女叉下体 | 久久偷拍无码 | 狼友在线视频观看 | 国产精品国产三级国产专区55 | 三上悠亚在线网站 | 国产a自拍 | 动漫美女被狂揉下部羞羞 | 成人免费无码婬片在线 |