Spring @Schedule定時任務不能同時觸發的問題

最近項目中用到基於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

相關文章
相關標籤/搜索