SpringBoot中定时任务@Scheduled详解

在开发的时候,我们可能会经常使用SpringBoot中的@Scheduled来实现定时任务,但是在使用过程中可能常常会遇到一些些问题

本来一个定时任务是3秒执行一次,可是过了3秒还是没有执行。这个时候我们就知道为什么会出现这个问题?

其实,SpringBoot中的@Scheduled默认是单线程在执行的,这就会出现阻塞。一定要等到一个任务执行完成,才会继续执行下一个任务。所以就出现上述情况。

如何证明啦?下面上代码:

@Component
public class TimeTaskJob {

	@Scheduled(cron = "0/10 * * * * ?")
	public void SpringTimeTask() {
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("调度任务一:" + DateUtils.formatDateByFormat(new Date(), DateUtils.PATTERN_4));
		System.out.println(
				"Springboot调度任务一: " + Thread.currentThread().getId() + "----" + Thread.currentThread().getName());

	}

	@Scheduled(cron = "0/10 * * * * ?")
	public void SpringTimeTask2() {
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println("调度任务二:" + DateUtils.formatDateByFormat(new Date(), DateUtils.PATTERN_4));
		System.out.println(
				"Springboot调度任务二: " + Thread.currentThread().getId() + "----" + Thread.currentThread().getName());

	}

}

上面代码定义了两个定时任务,打印了对应的执行线程的Id和名字,我们看是否是同一线程执行就可以确认是否同一线程。

上图结论:

1、多个定时任务同一线程执行

2、执行完第一个线程,才开始执行第二个线程。

那有没有办法让两个线程同时开始执行,且互不影响啦?这肯定是有的啦,必须要相信SpringBoot的强大。

我们只要实现SchedulingConfigurer类,并重写他的方法就OK

@EnableScheduling
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {

	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		taskRegistrar.setScheduler(taskExecutor());
	}

	@Bean(destroyMethod = "shutdown")
	public Executor taskExecutor() {
		return Executors.newScheduledThreadPool(10);
	}
}

执行结果:

我们可以看到执行结果,两个调度任务是同时执行的,且分别由不同的线程执行。至此顺利解决了@Scheduled的坑

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值