多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
**1. 什么叫并发** >[info]上一次的任务还没完成,下一次的任务就又开始了 假设有一个任务实例每隔 2s 执行一次,但需要 5s 的时间才能完成这次任务,就会触发并发问题。 ```java @Slf4j public class UserJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { JobKey jobKey = context.getJobDetail().getKey(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("任务ID: {}", jobKey.getGroup() + "." + jobKey.getName()); } } ``` 当被触发器触发时日志打印如下: ``` //可以看到下面每隔 2s 就会打印一个日志, //虽然执行该任务一次需要 5s,但只要到了每隔 2s 的时间就会被执行 //即上一次的任务还没完成,下一次的任务就又开始了,这便是并发的问题 2023-03-31T20:12:20 ...job.UserJob : 任务ID: job-group1.job10 2023-03-31T20:12:22 ...job.UserJob : 任务ID: job-group1.job10 2023-03-31T20:12:24 ...job.UserJob : 任务ID: job-group1.job10 2023-03-31T20:12:26 ...job.UserJob : 任务ID: job-group1.job10 2023-03-31T20:12:28 ...job.UserJob : 任务ID: job-group1.job10 ``` <br/> **2. 禁止并发** >[info]下一个任务必须等待上一个任务完成后才能被执行。 如果不想要这种并发任务,可以标注注解`@DisallowConcurrentExecution`来防止。 ```java @Slf4j @DisallowConcurrentExecution public class UserJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { JobKey jobKey = context.getJobDetail().getKey(); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } log.info("任务ID: {}", jobKey.getGroup() + "." + jobKey.getName()); } } ``` 当被触发器触发时日志打印如下: ``` //可以看到每隔 7s 才打印一次日志,它执行的时间间隔如下: //每次任务执行的间隔 = 触发器中定义的任务执行间隔 + 这次任务执行完成所需的时间 //说明下一个任务必须等待上一个任务完成后才能被执行 2023-03-31T20:24:03 ...job.UserJob : 任务ID: job-group1.job10 2023-03-31T20:24:10 ...job.UserJob : 任务ID: job-group1.job10 2023-03-31T20:24:15 ...job.UserJob : 任务ID: job-group1.job10 2023-03-31T20:24:22 ...job.UserJob : 任务ID: job-group1.job10 2023-03-31T20:24:27 ...job.UserJob : 任务ID: job-group1.job10 ```