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秒时再启用新的线程执行