SpringBoot设置多线程执行定时任务

问题描述

SpringBoot定时任务默认都是使用单线程执行的,如果有多个定时任务同时执行的话,那么就可能会导致很多任务无法按时准确执行。

单线程定时任务示例:

代码片

@Component
public class TaskTest {

    /**
     * @描述 定时任务111设置为每天16:20:00执行
     * @param
     * @作者 swzhu
     * @时间 2020/4/16 16:17
     * @return void
     **/
    @Scheduled(cron = "0 20 16 * * ?")
    public void test(){
        SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
        System.out.println("定时任务111执行开始!开始时间:" + format.format(new Date()));
        try {
            Thread.sleep(5000);
        } catch (Exception e){
            e.printStackTrace();
        }
        System.out.println("定时任务111执行结束!结束时间:" + format.format(new Date()));
    }

    /**
     * @描述 定时任务222设置为每天16:20:00执行
     * @param
     * @作者 swzhu
     * @时间 2020/4/16 16:17
     * @return void
     **/
    @Scheduled(cron = "0 20 16 * * ?")
    public void test2(){
        SimpleDateFormat format = new SimpleDateFormat("hh:mm:ss");
        System.out.println("定时任务222执行开始!开始时间:" + format.format(new Date()));
        System.out.println("定时任务222执行结束!结束时间:" + format.format(new Date()));
    }
}

单线程执行结果
在这里插入图片描述
可以看到,两个定时任务设置的都是16:20:00执行。但实际上,定时任务222是等定时任务111执行结束后才执行的。

设置定时任务为多线程

方法一

添加一个配置类,定时任务类和方法不用做任何改变。
代码片

@Configuration
public class ScheduledConfig {

    /**
     * @描述 所有的定时任务都放在一个线程池中,定时任务启动时使用不同的线程
     * @param
     * @作者 swzhu
     * @时间 2020/4/16 11:47
     * @return org.springframework.scheduling.TaskScheduler
     **/
    @Bean
    public TaskScheduler taskScheduler(){
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        // 设置scheduler执行线程为5个
        scheduler.setPoolSize(5);
        return scheduler;
    }
}
方法二

添加一个配置类,实现SchedulingConfigurer接口,重写configureTasks方法,定时任务类和方法不用做任何改变。
代码片

@Configuration
public class SchedulingConfig implements SchedulingConfigurer {
    /**
     * @描述 所有的定时任务都放在一个线程池中,定时任务启动时使用不同的线程
     * @param
     * @作者 swzhu
     * @时间 2020/4/16 11:47
     * @return 
     **/
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        //设定一个定时任务线程池,数量为5
        taskRegistrar.setScheduler(Executors.newScheduledThreadPool(5));
    }
}

多线程执行结果
在这里插入图片描述
可以看到,设置定时任务为多线程之后,定时任务222并没有等待定时任务111执行完才执行,而是和定时任务111同时执行。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值