前言:

  四种测试情况,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. 如何用Word制作斜线表头?

    如何用Word制作斜线表头?遇到这种问题,你一般是如何操作?本期企业网盘坚果云干货分享与大家分享有关斜线表头的制作方法. 斜线表头分单斜线表头和多斜线表头,下面分情况来了解相关的解决办法. 单斜线表头 ...

  2. 目标检测中roi的有关操作

    1.roi pooling 将从rpn中得到的不同Proposal大小变为fixed_length output, 也就是将roi区域的卷积特征拆分成为H*W个网格,对每个网格进行maxpooling ...

  3. 【leetcode】907. Sum of Subarray Minimums

    题目如下: 解题思路:我的想法对于数组中任意一个元素,找出其左右两边最近的小于自己的元素.例如[1,3,2,4,5,1],元素2左边比自己小的元素是1,那么大于自己的区间就是[3],右边的区间就是[4 ...

  4. jdbc的连接数据库,使用PreparedStatement实现增删改查等接口

    首先是连接,关闭资源等数据库操作 将连接数据库,关闭资源封装在JDBCUtils里 package jdbc.utils; import java.sql.Connection; import jav ...

  5. $router和router区别

    this.$router.push({path:'/'})//这个是js编程式的一种动态跳转路由方式,是全局的路由对象. 而写在router声明文件中的router是自己定义实例化的一个对象.可以使用 ...

  6. php开发面试题---攻击网站的常用手段有哪些,及如何预防(整理)

    php开发面试题---攻击网站的常用手段有哪些,及如何预防(整理) 一.总结 一句话总结: 比较记忆:注意比较各种攻击的区别,比如csrf和xss,以及xss和sql,这样才能记住 1.Sql注入是什 ...

  7. 屏蔽浏览器默认样式 user agent stylesheet

    user agent stylesheet <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &q ...

  8. JS-text节点模拟innerHTML属性

    # [在线预览](https://jsfiddle.net/1010543618/mz7ybu8g/2/) text 节点无 innerHTML 这个属性!!! 如果直接修改 text 节点的属性(d ...

  9. 从源码导入到github

    http://stackoverflow.com/questions/4658606/import-existing-source-code-to-github If you've got local ...

  10. Linux的文件访问权限及修改权限命令chmod

    http://www.linuxso.com/command/chmod.html Linux的文件访问权限及修改权限命令chmod Mxx000 Mxx000 人赞同了该文章 Linux的文件访问权 ...