前言
Spring提供了定时任务的实现。以SpringBoot为例,在主运行类上添加@EnableScheduling
注解即可开启对定时任务的支持。同时,在定时任务方法上配合@Scheduled
注解来实现执行计划的配置。
需要注意的是,默认情况下,Spring只会为定时任务分配一个线程。因此,多个定时任务是在单线程中顺序执行的,也就是说,任务A尚未执行完毕时,排在其后的任务B需要等待任务A结束后才能执行。
问题分析
现在我们通过源码来验证上述的说法,看看Spring是怎么为定时任务分配的线程。
现在我们定位到org.springframework.scheduling.config.ScheduledTaskRegistrar
类,该类有个scheduleTasks()
方法,该方法的第一个if
判断表明,当taskScheduler
为null
时,会创建一个单线程线程池。
问题解决
通过查看源码可知,我们需要为taskScheduler
指定一个多线程的线程池,
才能达到多线程执行定时任务的效果。
方法如下:
- 创建一个配置类,实现
org.springframework.scheduling.annotation.SchedulingConfigurer
接口 - 重写
configureTasks()
方法
该方法将ScheduledTaskRegistrar
实例作为参数传入,该实例的类正是我们刚才分析scheduleTasks()
方法时出现的类。 - 调用
ScheduledTaskRegistrar.setScheduler()
方法,为它指定一个线程池。
@Configuration
public class ScheduleConfiguration implements SchedulingConfigurer {
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
}
}
网友评论