美文网首页Springboot
SpringSchedual多线程执行

SpringSchedual多线程执行

作者: 8813d76fee36 | 来源:发表于2018-09-11 16:50 被阅读100次

    前言

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

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

    问题分析

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

    scheduleTasks()

    问题解决

    通过查看源码可知,我们需要为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));
        }
    }
    

    相关文章

      网友评论

        本文标题:SpringSchedual多线程执行

        本文链接:https://www.haomeiwen.com/subject/zqvugftx.html