concurrent=false/true的定时任务job策略介绍
前言:
四种测试情况,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策略介绍的更多相关文章
- python 定时任务APScheduler 使用介绍
python 定时任务APScheduler 使用介绍 介绍: APScheduler的全称是Advanced Python Scheduler.它是一个轻量级的 Python 定时任务调度框架. ...
- GC之一--GC 的算法分析、垃圾收集器、内存分配策略介绍
一.概述 垃圾收集 Garbage Collection 通常被称为“GC”,它诞生于1960年 MIT 的 Lisp 语言,经过半个多世纪,目前已经十分成熟了. jvm 中,程序计数器.虚拟机栈.本 ...
- document.execCommand(”BackgroundImageCache”, false, true)
很多时候我们要给一些按钮或是img设置背景,而为了达到数据与表现样式分离的效果,通常背景样式都是在CSS里设定的,但是这个行为在IE会有一 个Bug,那就是因为 IE默认情况下不缓存背景图片,所以当鼠 ...
- Linux内核策略介绍
Linux内核策略介绍学习笔记 主要内容 硬件 策略 CPU 进程调度.系统调用.中断 内存 内存管理 外存 文件IO 网络 协议栈 其他 时间管理 进程调度 内核的运行时间 系统启动.中断发 ...
- 一道Python面试题:给出d = [True, False, True, False, True],请利用列表d,只用一句话返回列表[0,2,4]
看题:给出d = [True, False, True, False, True],请利用列表d,只用一句话返回列表[0,2,4] 这道题的关键是拿到True的索引值,最初我是用list的index方 ...
- HBase 的MOB压缩分区策略介绍
版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/zNZQhb07Nr/article/details/79832392 HBase应用场景很广泛.社区 ...
- Ajax请求中的async:false/true的作用【转载】
[Ajax请求中的async:false/true的作用] 作者:https://www.cnblogs.com/mmzuo-798/p/7098979.html 前言: 昨天在做倒计时修改的时候,发 ...
- Ajax请求中的async:false/true
Ajax请求中的async:false/trueasync. 默认是 true,即为异步方式,$.ajax执行后,会继续执行ajax后面的脚本,直到服务器端返回数据后,触发$.ajax里的succes ...
- document.execCommand("BackgroundImageCache",false,true)解决ie6下的背景图片缓存问题
E6下的背景图片每次使用都会重新发送请求(not 本地),连一个hover效果时候同样的背景图片仅仅位置不同而已,ie6都会再次发送请求,这个令人崩溃的事情需要解决掉:对于ie来说,filter:ex ...
随机推荐
- mysql安装与修改密码
数据库基本概念:数据的仓库 数据库服务器-->数据库-->表-->记录-->属性(列,字段) unix下数据库服务安装: apt-get install -y mysql-se ...
- ubuntu oracle数据库18c安装
一.官网下载linux两个zip包 二.byqKx8a2tWcgBHb
- 关键字group by 、 Having的 用法
概述 GROUP BY我们可以先从字面上来理解,GROUP表示分组,BY后面写字段名,就表示根据哪个字段进行分组,如果有用Excel比较多的话,GROUP BY比较类似Excel里面的透视表. GRO ...
- 【集群】Redis的哨兵模式和集群模式
哨兵模式 哨兵模式是redis高可用的实现方式之一 使用一个或者多个哨兵(Sentinel)实例组成的系统,对redis节点进行监控,在主节点出现故障的情况下,能将从节点中的一个升级为主节点,进行故障 ...
- DM9000驱动网卡编程
DM9000数据发送编程: static int dm9000_start_xmit(struct sk_buff *skb, struct net_device *dev) { unsigned l ...
- [NOIP模拟测试38]题解
来自达哥的问候…… A.金 显然本题的考察点在于高精而不是裴蜀定理 根据裴蜀定理易得答案为Yes当且仅当$gcd(n,m)=1$,那么考虑怎么在高精度下判互质. 如果$n,m$都能被2整除,那么显然不 ...
- Javascript 数组 数字 字符串 时间等使用
1.Javascript 数组API 1. //定义数组 2. var pageIds = new Array(); 3. pageIds.push('A'); 5. 数组长度 6. pageIds. ...
- 正则匹配class并替换整个class为空
str.replace(/class=[\"|'](.*?)[\"|'].*?/g, '')
- python 的装饰器,
昨天去面试,发现了装饰器还是不太熟悉, 笔试题目是: 随意编写两个对输入参数做加减乘除运算的函数(需要有除法),写完后,用装饰器实现对函数出现除数为0的异常捕获,如果有异常,使用print打印日志. ...
- CPU、内存、磁盘三者的关系
参考:https://blog.csdn.net/weini1111/article/details/70849332 cpu是大脑,计算数据用的. 内存是草稿纸,开着电脑一直都在用里边的数据,如果断 ...