Springboot

SpringSchedual多线程执行

2018-09-11  本文已影响100人  8813d76fee36

前言

Spring提供了定时任务的实现。以SpringBoot为例,在主运行类上添加@EnableScheduling注解即可开启对定时任务的支持。同时,在定时任务方法上配合@Scheduled注解来实现执行计划的配置。

需要注意的是,默认情况下,Spring只会为定时任务分配一个线程。因此,多个定时任务是在单线程中顺序执行的,也就是说,任务A尚未执行完毕时,排在其后的任务B需要等待任务A结束后才能执行。

问题分析

现在我们通过源码来验证上述的说法,看看Spring是怎么为定时任务分配的线程。
现在我们定位到org.springframework.scheduling.config.ScheduledTaskRegistrar类,该类有个scheduleTasks()方法,该方法的第一个if判断表明,当taskSchedulernull时,会创建一个单线程线程池。

scheduleTasks()

问题解决

通过查看源码可知,我们需要为taskScheduler指定一个多线程的线程池,
才能达到多线程执行定时任务的效果。

方法如下:

定时任务配置
@Configuration
public class ScheduleConfiguration implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(10));
    }
}
上一篇下一篇

猜你喜欢

热点阅读