最近项目中用到基于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
两个任务一起出发了。