自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

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

開發(fā) 架構(gòu)
最近長文擼多了,有點累,今天來點簡單的。今天這篇文章介紹一下Spring Boot 中 如何開啟多線程定時任務(wù)?

最近長文擼多了,有點累,今天來點簡單的。

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

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

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

  1. protected void scheduleTasks() { 
  2.   if (this.taskScheduler == null) { 
  3.    this.localExecutor = Executors.newSingleThreadScheduledExecutor(); 
  4.    this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor); 
  5.   } 

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

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

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

1、重寫SchedulingConfigurer#configureTasks()

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

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

2、通過配置開啟

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

  1. spring.task.scheduling.pool.size=10 

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

3、結(jié)合@Async

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

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

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

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

總結(jié)

 

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

 

責(zé)任編輯:武曉燕 來源: 碼猿技術(shù)專欄
相關(guān)推薦

2024-10-15 16:41:35

2012-02-07 13:31:14

SpringJava

2025-01-08 09:55:37

Spring接口數(shù)據(jù)庫

2023-08-08 08:35:28

web框架Hosting模塊

2022-03-23 11:45:39

Quartz數(shù)據(jù)庫節(jié)點

2024-10-10 10:32:04

2024-11-04 16:01:01

2019-11-26 14:30:20

Spring循環(huán)依賴Java

2018-08-20 07:04:35

2021-09-26 09:17:01

Python命令定時任務(wù)

2025-02-24 16:00:00

SpringBoot定時任務(wù)開發(fā)

2009-10-28 10:05:29

Ubuntucrontab定時任務(wù)

2010-03-10 15:47:58

crontab定時任務(wù)

2012-09-05 11:09:15

SELinux操作系統(tǒng)

2023-11-07 07:47:35

Topic線程PUSH

2019-02-25 15:44:16

開源RabbitMQSpring Clou

2017-03-13 09:12:00

TCP數(shù)據(jù)結(jié)構(gòu)請求包

2024-02-28 09:54:07

線程池配置

2022-03-28 08:31:29

線程池定時任務(wù)

2024-12-27 08:24:55

點贊
收藏

51CTO技術(shù)棧公眾號