前言:

  四种测试情况,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. C++ 虚函数和多重继承的内存布局初探

    C++ 对象的内存布局 一切以事实说话: 代码: 1: #include <stdio.h> 2:  3: class A { 4: public: 5: int a; 6: int b; ...

  2. excel导出简单示例(jxl jar包)

    @param title excel文件名 @param excelTopName 表头中文名字(显示在第一行的中文表头内容) @param header 表头字段属性(根据该属性获取对应的属性值,表 ...

  3. python3 实现简单ftp服务功能(客户端)

    转载请注明出处! 可执行的命令: lspwdcd put rm get mkdir 上传下载,显示进度百分比以及平均上传下载速度 客户端 main代码: #Author by Andy #_*_ co ...

  4. 在Anaconda环境下使用Jupyter Notebook

    !!!Anaconda 和 Jupyter Notebook 在 zsh 环境下不能正常使用! 启动建立的 Anaconda 环境 安装 nb_conda:conda install nb_conda ...

  5. python plotly 使用教程

    1.plotly介绍 lotly的Python图形库使互动的出版质量图表成为在线. 如何制作线图,散点图,面积图,条形图,误差线,箱形图,直方图,热图,子图,多轴,极坐标图和气泡图的示例. 推荐最好使 ...

  6. SQL IN 运算符

    SQL IN 运算符 IN运算符允许您在WHERE子句中指定多个值. IN运算符是多个OR条件的简写. SQL IN 语法 SELECT column_name(s) FROM table_name ...

  7. Network基础(三):网线的制作、交换机基本命令模式、交换机命令行基本配置、交换机的密码设置

    一.网线的制作 目标: 在常见的计算机网络中,网线主要用来连接计算机与交换机(或宽带路由器).交换机与交换机.交换机与路由器,以及需要连网的其他各种设备.网线的制作与测试是作为网络管理员的一个入门技能 ...

  8. 77 geometry process

    0 引言 记录几何方面的一些处理技术. 1 任意多边形面积计算:包含凸多边形和凹多边形 转载了JustDoIT https://www.cnblogs.com/TenosDoIt/p/4047211. ...

  9. UVa455 最小周期串问题

    A character string is said to have period k if it can be formed by concatenating one or more repetit ...

  10. layui表单提交使用form.on('submit(sub)',function (){}) 使用ajax请求时回调不执行的原因及解决方法

    ayui使用官方的表单模块form.on('submit(sub)',function (){}) 提交,使用ajax请求向后台请求一个执行结果,根据结果进行处理,出现回调无法执行,并且页面出现了刷新 ...