Spring @Schedule定时任务不能同时触发的问题

本文探讨了如何在Spring框架中使用线程池使多个定时任务实现并行执行,而非按顺序排队执行的问题。通过具体代码示例展示了不使用线程池时任务执行的顺序性和使用线程池后的并行效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近项目中用到基于Spring注解@Schedule做定时任务触发,开始配置多个任务都是同一时间后触发的,但总是出现一个任务开始后其他任务都要等待先触发的任务执行完毕才能接着执行,并不能按照我们的意愿同时去触发。通过了解了下Spring定时任务调度的机制,其实这可以使用线程池来解决。

先看不用线程池

//任务1
@Scheduled(cron = "0/5 * * * * *")
	public void task1() {
		System.out.println("Task1");
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Task1"+new Date());
	}


//任务2
@Scheduled(cron = "0/5 * * * * *")
	public void task2() {
		System.out.println("Task2");
		try {
			Thread.sleep(5000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("Task2"+new Date());
	}

我要上面两个任务都在程序启动后5s执行,下面是运行结果:

Task2
Task2Mon Dec 12 20:16:00 CST 2016
Task1
Task1Mon Dec 12 20:16:05 CST 2016
Task2
Task2Mon Dec 12 20:16:10 CST 2016
Task1
Task1Mon Dec 12 20:16:15 CST 2016
Task2

其实是排队执行的。。。。

使用线程池

class RunTask implements Runnable {
		
		private String taskName;
		
		public RunTask(String taskName) {
			this.taskName = taskName;
		}

		@Override
		public void run() {
			System.out.println(this.taskName);
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println(this.taskName+new Date());
		}
	}


//任务1
	@Scheduled(cron = "0/5 * * * * *")
	public void task1() {

		pool.execute(new Thread(new RunTask("Task1")));
	}

//任务2
@Scheduled(cron = "0/5 * * * * *")
	public void task2() {

		pool.execute(new Thread(new RunTask("Task2")));
	}

运行结果:

Task2
Task1
Task2Mon Dec 12 20:18:10 CST 2016
Task1
Task2
Task1Mon Dec 12 20:18:10 CST 2016
Task2Mon Dec 12 20:18:15 CST 2016
Task1Mon Dec 12 20:18:15 CST 2016
Task1
Task2
Task1
Task2
Task1Mon Dec 12 20:18:20 CST 2016
Task2Mon Dec 12 20:18:20 CST 2016
Task2Mon Dec 12 20:18:25 CST 2016
Task1Mon Dec 12 20:18:25 CST 2016
Task1
Task2
Task1Mon Dec 12 20:18:30 CST 2016
Task2Mon Dec 12 20:18:30 CST 2016
Task1
Task2

两个任务一起出发了。

转载于:https://my.oschina.net/ChiLin/blog/807478

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值