Spring @Schedule定时任务不能同时触发的问题 https://my.oschina.net/ChiLin/blog/807478
最近项目中用到基于Spring注解@Schedule做定时任务触发,开始配置多个任务都是同一时间后触发的,但总是出现一个任务开始后其他任务都要等待先触发的任务执行完毕才能接着执行,并不能按照我们的意愿同时去触发。通过了解了下Spring定时任务调度的机制,其实这可以使用线程池来解决。
先看不用线程池
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
//任务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执行,下面是运行结果:
1 2 3 4 5 6 7 8 9 |
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 |
其实是排队执行的。。。。
使用线程池
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
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"))); } |
运行结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
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 |
两个任务一起出发了。