最近項目中用到基於Spring註解@Schedule作定時任務觸發,開始配置多個任務都是同一時間後觸發的,但老是出現一個任務開始後其餘任務都要等待先觸發的任務執行完畢才能接着執行,並不能按照咱們的意願同時去觸發。經過了解了下Spring定時任務調度的機制,其實這能夠使用線程池來解決。java
先看不用線程池apache
//任務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執行,下面是運行結果:ide
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
實際上是排隊執行的。。。。this
使用線程池線程
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"))); }
運行結果:code
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
兩個任務一塊兒出發了。io