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慢日志
mysql慢日志太多,需要分析下具体有哪些慢日志 mysql可以直接记录所有慢日志,现在的问题是将日志文件sql进行去重 想了老半天该怎样将sql的查询字段去掉进行排序,没有get到重点.后来发现my ...
- 四、yml文件的写法
1.创建一个新的工程 注意:只有properties文件,没有包含yaml文件 2.创建一个yml文件 全局配置配置文件,文件名是固定的application 作用:修改SpringBoot自动配置的 ...
- C++ 之获取map元素[转]
链接:https://www.cnblogs.com/jianfeifeng/p/11089799.html 对于map对象, count成员返回值只能是0或者1,map容器只允许一个键对应一个实例. ...
- leetcode-166周赛-5280-用户分组
题目描述: 自己的提交: class Solution: def groupThePeople(self, groupSizes: List[int]) -> List[List[int]]: ...
- 每天一个linux命令:file(11)
file file命令用来探测给定文件的类型.file命令对文件的检查分为文件系统.魔法幻数检查和语言检查3个过程. 格式 file [选项] [参数] 参数选项 参数 备注 -b 列出辨识结果时,不 ...
- yii2 后台前后台 前后台登陆、退出问题
问题描述:我使用前后台分离 配置如下: 'user' => [ 'identityClass' => 'app\models\User', 'enableAutoLogin' => ...
- 学习java web中的listener
web.xml里的顺序为:context-param->listener->filter->servlet 监听器是需要新建一个类,然后按监听的对象继承:ServletContext ...
- paper 147:Deep Learning -- Face Data Augmentation(一)
1. 在深度学习中,当数据量不够大时候,常常采用下面4中方法: (1)人工增加训练集的大小. 通过平移, 翻转, 加噪声等方法从已有数据中创造出一批"新"的数据.也就是Data ...
- context和getApplicationContext()的区别
在android中常常会遇到与context有关的内容 浅论一下 context : 在语句 AlertDialog.Builder builder = new AlertDialog.Builder ...
- (转)使用OpenGL显示图像(三)绘制Shapes
绘制形状 编写:jdneo - 原文:http://developer.android.com/training/graphics/opengl/draw.html 在定义了使用OpenGL绘制的形状 ...