Spring Boot 如何解决多个定时任务阻塞问题? 真的学不动了

今天这篇文章介绍一下Spring Boot 中 如何开启多线程定时任务?

为什么Spring Boot 定时任务是单线程的?
想要解释为什么,一定要从源码入手,直接从@EnableScheduling这个注解入手,找到了这个ScheduledTaskRegistrar类,其中有一段代码如下:

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

如果taskScheduler为null,则创建单线程的线程池:Executors.newSingleThreadScheduledExecutor()。

多线程定时任务如何配置?
下面介绍三种方案配置多线程下的定时任务。

1、重写SchedulingConfigurer#configureTasks()
直接实现SchedulingConfigurer这个接口,设置taskScheduler,代码如下:

@Configurationpublic class ScheduleConfig implements SchedulingConfigurer 
{    
@Override    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) 
{        
//设定一个长度10的定时任务线程池        
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));    
}
}

2、通过配置开启
Spring Boot quartz 已经提供了一个配置用来配置线程池的大小,如下;

spring.task.scheduling.pool.size=10
只需要在配置文件中添加如上的配置即可生效!

可以关注小编+转发文章+私信【架构资料】获取,最后祝大家都能拿到自己心仪的offer

3、结合@Async
@Async这个注解都用过,用来开启异步任务的,使用@Async这个注解之前一定是要先配置线程池的,配置如下:

    @Bean    public ThreadPoolTaskExecutor taskExecutor() 
{        
ThreadPoolTaskExecutor poolTaskExecutor = new ThreadPoolTaskExecutor();        
poolTaskExecutor.setCorePoolSize(4);        
poolTaskExecutor.setMaxPoolSize(6);        
// 设置线程活跃时间(秒)        
poolTaskExecutor.setKeepAliveSeconds(120);        
// 设置队列容量        
poolTaskExecutor.setQueueCapacity(40);        
poolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());        
// 等待所有任务结束后再关闭线程池        
poolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);        
return poolTaskExecutor;    }
然后在@Scheduled方法上标注@Async这个注解即可实现多线程定时任务,代码如下:

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

总结
本篇文章介绍了Spring Boot 中 实现多线程定时任务的三种方案,你喜欢哪一种?
最新BAT java经典必考面试题链接:https://pan.baidu.com/s/1B_Lc1tluda0fbdrFnexOMQ
提取码:gw8d

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java架构蒙塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值