前言:
四種測試情況,cronExpression = 0/30 * * * * ? :
1,一個trigger,job設置的是每30s執行一次,實際需要75s;concurrent=false;
2,一個trigger,job設置的是每30s執行一次,實際需要75s;concurrent=true;
3,兩個trigger,執行同一個job,job設置的是每30s執行一次,實際需要75s;concurrent=false;
4,兩個trigger,執行同一個job,job設置的是每30s執行一次,實際需要75s;concurrent=true;
4種情況執行相同的job,如下:
// 執行job
public void hit() throws InterruptedException {
LOGGER.info("現在時間是" + DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss") + ", 打貝貝...");
Thread.sleep(75000);
LOGGER.info("現在時間是" + DateUtil.dateToString(new Date(), "yyyy-MM-dd HH:mm:ss") + ", 過去了75秒...");
}
情況1:org.quartz.threadPool.threadCount = 10;concurrent=false;
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:26:30, 打貝貝...
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:27:45, 過去了75秒..
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:27:45, 打貝貝... ----------------------在18:27:00就等着了?
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:29:00, 過去了75秒..
Worker-3] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:29:00, 打貝貝... ----------------------在18:27:30就等着了?
Worker-3] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:30:15, 過去了75秒..
Worker-4] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:30:15, 打貝貝... ----------------------在18:28:00就等着了?
Worker-4] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:31:30, 過去了75秒..
Worker-5] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:31:30, 打貝貝... ----------------------在18:28:30就等着了?
情況2:org.quartz.threadPool.threadCount = 10;concurrent=true;
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:47:30, 打貝貝...
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:48:00, 打貝貝...
Worker-3] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:48:30, 打貝貝...
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:48:45, 過去了75秒...
Worker-4] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:49:00, 打貝貝...
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:49:15, 過去了75秒...
Worker-5] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:49:30, 打貝貝...
Worker-3] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:49:45, 過去了75秒...
Worker-6] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:50:00, 打貝貝...
Worker-4] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:50:15, 過去了75秒...
Worker-7] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:50:30, 打貝貝...
Worker-5] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:50:45, 過去了75秒...
Worker-8] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:51:00, 打貝貝...
Worker-6] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:51:15, 過去了75秒...
Worker-9] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:51:30, 打貝貝...
Worker-7] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:51:45, 過去了75秒...
Worker-10] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:52:00, 打貝貝...
Worker-8] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:52:15, 過去了75秒...
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:52:30, 打貝貝...
Worker-9] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:52:45, 過去了75秒...
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:53:00, 打貝貝...
Worker-10] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:53:15, 過去了75秒...
情況2:org.quartz.threadPool.threadCount = 2;concurrent=true;
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:57:30, 打貝貝...
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:58:00, 打貝貝...
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:58:45, 過去了75秒.
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:58:45, 打貝貝... ----------------------在18:58:30就等着了?
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:59:15, 過去了75秒.
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 18:59:15, 打貝貝... ----------------------在18:59:00就等着了?
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:00:00, 過去了75秒.
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:00:00, 打貝貝... ----------------------在18:59:30就等着了?
情況3:org.quartz.threadPool.threadCount = 2;concurrent=false;
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:07:00, 打貝貝...
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:08:15, 過去了75秒.
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:08:15, 打貝貝... ----------------------在19:07:00就等着了?
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:09:30, 過去了75秒.
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:09:30, 打貝貝... ----------------------在19:07:30就等着了?
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:10:45, 過去了75秒.
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:10:45, 打貝貝... ----------------------在19:07:30就等着了?
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:12:00, 過去了75秒.
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:12:00, 打貝貝...
情況4:org.quartz.threadPool.threadCount = 2;concurrent=true;
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:18:00, 打貝貝...
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:18:00, 打貝貝...
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:19:15, 過去了75秒.
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:19:15, 過去了75秒.
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:19:15, 打貝貝... ----------------------在19:18:30就等着了?
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:19:15, 打貝貝... ----------------------在19:18:30就等着了?
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:20:30, 過去了75秒.
Worker-2] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:20:30, 打貝貝... ----------------------在19:19:00就等着了?
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:20:30, 過去了75秒.
Worker-1] INFO c.s.s.s.timertask.schedule.HitBeibeiScheduler - 現在時間是2019-12-23 19:20:30, 打貝貝... ----------------------在19:19:00就等着了?
總結:
定時任務有 SchedulerFactoryBean、CronTriggerFactoryBean、MethodInvokingJobDetailFactoryBean三個概念,簡單的說SchedulerFactory管理了很多trigger,trigger執行一個job。concurrent=false/true是job的屬性;所以concurrent=false時,在任意時刻,有且只能有一個線程在執行這個job,其他線程試圖執行這個job時,都會進入等待狀態,直到該job沒有線程在“占用”;而當concurrent=true時,各個線程都會按照自己的節奏執行這個job;而當SchedulerFactory的屬性org.quartz.threadPool.threadCount = 1時,也自然只有一個線程在執行這個job,沒有多余的其他線程來執行這個job,和concurrent=false的效果是一樣的。雖然定時任務設置的是0/30的時候執行,但是都會有在15/45的時候執行的情況;說明0/30的時候線程池都會安排一個線程去執行,有空閑線程自然要等待,一旦這個job沒有線程在占用時立馬執行,而不是只在0/30的時候執行;沒有空閑線程時,一旦出現空閑線程的時候也會立即執行,也不是只在0/30的時候執行;但是這樣不會產生很嚴重的滯后性嗎,因為現在執行的線程很可能是一個小時前線程池安排的??。
所以,concurrent=true,只是為了可以有多個線程來同時執行同一個job;反之,concurrent=false,只是為了禁止有多個線程來同時執行同一個job。具體的實現,還是看業務效果吧!