Quartz定時任務默認都是併發執行的,不會等待上一次任務執行完畢,只要間隔時間到就會執行, 若是定時任執行太長,會長時間佔用資源,致使其它任務堵塞。spring
在Spring中這時須要設置concurrent的值爲false, 禁止併發執行。併發
<property name="concurrent" value="true" />框架
當不使用spring的時候就須要在Job的實現類上加@DisallowConcurrentExecution的註釋測試
@DisallowConcurrentExecution 禁止併發執行多個相同定義的JobDetail, 這個註解是加在Job類上的,線程
但意思並非不能同時執行多個Job, 而是不能併發執行同一個Job Definition(由JobDetail定義),資源
可是能夠同時執行多個不一樣的JobDetail, 舉例說明,咱們有一個Job類,叫作SayHelloJob, 並在這個Job上加了這個註解, 而後在這個Job上定義了不少個JobDetail,it
如sayHelloToJoeJobDetail, sayHelloToMikeJobDetail, 那麼當scheduler啓動時, 不會併發執行多個sayHelloToJoeJobDetail或者sayHelloToMikeJobDetail,io
但能夠同時執行sayHelloToJoeJobDetail跟sayHelloToMikeJobDetail定時任務
@PersistJobDataAfterExecution 一樣, 也是加在Job上,表示當正常執行完Job後, JobDataMap中的數據應該被改動, 以被下一次調用時用。程序
當使用@PersistJobDataAfterExecution 註解時, 爲了不併發時, 存儲數據形成混亂, 強烈建議把 @DisallowConcurrentExecution註解也加上。
@DisallowConcurrentExecution
此標記用在實現Job的類上面,意思是不容許併發執行,按照我以前的理解是 不容許調度框架在同一時刻調用Job類,
後來通過測試發現並非這樣,而是Job(任務)的執行時間[好比須要10秒]大於任務的時間間隔[Interval(5秒)],
那麼默認狀況下,調度框架爲了能讓 任務按照咱們預約的時間間隔執行,會立刻啓用新的線程執行任務。
不然的話會等待任務執行完畢之後 再從新執行!(這樣會致使任務的執行不是按照咱們預先定義的時間間隔執行)
測試代碼,這是官方提供的例子。設定的時間間隔爲3秒,但job執行時間是5秒,設置@DisallowConcurrentExecution之後程序會等任務執行完畢之後再去執行,不然會在3秒時再啓用新的線程執行