前言:

  四种测试情况,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。具体的实现,还是看业务效果吧!

concurrent=false/true的定时任务job策略介绍的更多相关文章

  1. python 定时任务APScheduler 使用介绍

    python 定时任务APScheduler 使用介绍   介绍: APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的 Python 定时任务调度框架. ...

  2. GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍

    一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...

  3. document.execCommand(”BackgroundImageCache”, false, true)

    很多时候我们要给一些按钮或是img设置背景,而为了达到数据与表现样式分离的效果,通常背景样式都是在CSS里设定的,但是这个行为在IE会有一 个Bug,那就是因为 IE默认情况下不缓存背景图片,所以当鼠 ...

  4. Linux内核策略介绍

      Linux内核策略介绍学习笔记   主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...

  5. 一道Python面试题:给出d = [True, False, True, False, True],请利用列表d,只用一句话返回列表[0,2,4]

    看题:给出d = [True, False, True, False, True],请利用列表d,只用一句话返回列表[0,2,4] 这道题的关键是拿到True的索引值,最初我是用list的index方 ...

  6. HBase 的MOB压缩分区策略介绍

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zNZQhb07Nr/article/details/79832392 HBase应用场景很广泛.社区 ...

  7. Ajax请求中的async:false/true的作用【转载】

    [Ajax请求中的async:false/true的作用] 作者:https://www.cnblogs.com/mmzuo-798/p/7098979.html 前言: 昨天在做倒计时修改的时候,发 ...

  8. Ajax请求中的async:false/true

    Ajax请求中的async:false/trueasync. 默认是 true,即为异步方式,$.ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.ajax里的succes ...

  9. document.execCommand("BackgroundImageCache",false,true)解决ie6下的背景图片缓存问题

    E6下的背景图片每次使用都会重新发送请求(not 本地),连一个hover效果时候同样的背景图片仅仅位置不同而已,ie6都会再次发送请求,这个令人崩溃的事情需要解决掉:对于ie来说,filter:ex ...

随机推荐

  1. 前端学习(二十六)移动端s(笔记)

    ===================================================弹性布局rem布局---------------------------------------- ...

  2. POJ1149PIGS

    传送门 貌似是最大流建图优化入门题(可惜我还是不会) 最暴力的建图当然是源点连每个猪圈然后猪圈需要拆成n个点分给每个人这个必定是跑不过的 所以我们可以进行优化 很明显没有被动过的猪圈一直是不变的可以不 ...

  3. Math.random()详解

    Math.random()是令系统随机选取大于等于 0.0 且小于 1.0 的伪随机 double 值,是Java语言常用代码.例如:double a=Math.random()*(3-1)+1,设置 ...

  4. jsp详解(3个指令、6个动作、9个内置对象、11个隐式对象)

    jsp概述SP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP实际上就是Servlet.    jsp=html+jav ...

  5. shell快速入门

    $? 表示上一个命令退出的状态,0表示执行正常,不等于0表示执行不正常. $$ 表示当前进程编号 $ 表示当前脚本名称 $# 表示参数的个数,常用于循环 $*和$@ 都表示参数列表 $n 表示n位置的 ...

  6. shell 根据路径获取文件名和目录

    path=/dir1/dir2/dir3/test.txt echo ${path##*/} 获取文件名 test.txtecho ${path##*.} 获取后缀 txt #不带后缀的文件名temp ...

  7. redis-持久化、主从复制、集群

    持久化 RDB.AOF(redis.conf) 主从复制 redis.conf 集群 redis-trib.rb.ruby相见如下链接http://www.cnblogs.com/wuxl360/p/ ...

  8. Ubuntu下Arm-Linux-GCC交叉编译环境的搭建

    1.下载arm-linux-gcc-3.4.1.tar.bz2到临时的目录下. 2.解压 arm-linux-gcc-3.4.1.tar.bz2 #tar -jxvf arm-linux-gcc-3. ...

  9. Linux 应用程序编程基础

    一个计算机应用程序在内存中可以分成两个部分:存放代码的代码段和存放数据的数据段.代码段存放用户编写的代码;数据段存放栈和堆. 相关内存管理函数 #include <stdlib.h> vo ...

  10. Docker Machine 管理-管理machine(17)

    用 docker-machine 创建 machine 的过程很简洁,非常适合多主机环境.除此之外,Docker Machine 也提供了一些子命令方便对 machine 进行管理.其中最常用的就是无 ...