定时任务实现方式对比
1. 定时任务实现方式对比
1.1. Timer
- 代码例子如下
public static void main(String[] args) {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");LocalDateTime localDateTime = LocalDateTime.now();String format = localDateTime.format(formatter);System.out.println("1:"+format);Timer timer = new Timer();for (int i = 0; i < 2; i++) {timer.schedule(new TimerTask() {@Overridepublic void run() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread name : "+ Thread.currentThread().getName());LocalDateTime localDateTime = LocalDateTime.now();String format = localDateTime.format(formatter);System.out.println("2:"+format);}}, 3000);}localDateTime = LocalDateTime.now();format = localDateTime.format(formatter);System.out.println("3:"+format);}
结果
1:2019-10-14 17:35:13
3:2019-10-14 17:35:13
Thread name : Timer-0
2:2019-10-14 17:35:19
Thread name : Timer-0
2:2019-10-14 17:35:22
- 可以看出同一个Timer的定时任务,后台就一个线程管理任务分配,遇到任务阻塞,可能导致下一个任务延迟
- 且如果任务发生异常,系统就终止了
1.2. ScheduledExecutorService
- 为了解决Timer的问题,
ScheduledExecutorService
做了改进,采用了线程池的定时任务队列,实际使用的也是最小堆排序 - 代码如下
private static DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");public static void main(String[] args) {
// timerTest();print("1:");ScheduledExecutorService service = new ScheduledThreadPoolExecutor(2);for (int i = 0; i < 2; i++) {service.schedule(new Runnable() {@Overridepublic void run() {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("Thread name : " + Thread.currentThread().getName());print("2:");}}, 3, TimeUnit.SECONDS);}print("3:");service.shutdown();}private static void print(String s) {LocalDateTime localDateTime = LocalDateTime.now();String format = localDateTime.format(formatter);System.out.println(s + format);}
结果
1:2019-10-15 11:53:54
3:2019-10-15 11:53:54
Thread name : pool-1-thread-1
2:2019-10-15 11:54:00
Thread name : pool-1-thread-2
2:2019-10-15 11:54:00
明白它的延迟原理和Timer一样,可以知道如果我把核心线程数改成1,则效果和Timer类似
- 结果如下,两个任务延迟3秒,前一个任务会导致后一个任务延迟
1:2019-10-15 11:57:40
3:2019-10-15 11:57:40
Thread name : pool-1-thread-1
2:2019-10-15 11:57:46
Thread name : pool-1-thread-1
2:2019-10-15 11:57:49
- 它的优势在于可以多线程执行,一定程度上避免任务间互相影响,同时单个任务异常不影响其它任务
1.3. 时间轮(延迟消息)
- 本质是环形数组,比如上述8个节点的时间轮,每个节点存放任务队列,比如我们需要新建5s延迟的任务,就放5的节点,新建10s延迟的任务就放2的节点,设延迟时间为n,则节点位置为n%8,同时需记下轮询圈数n/8
- 优势:当任务数量非常多的时候采用这样环形数组加队列是个效率比较高的选择
- 想要了解更多时间轮实现,可以参考文章下的参考博客
1.4. 分布式定时任务
- github上也有些开源的分布式定时任务的方案,可以直接使用
- 如xxl_job,elastic-job-lite,light-task-scheduler,以哪个火用哪个的原则,那还是xxl_job的星星最多,另外两个已经两年没更新了
参考博客:
延迟消息之时间轮
定时任务实现方式对比相关推荐
- python做定时任务的方式及优缺点_python BlockingScheduler定时任务及其他方式的实现...
本文介绍了python BlockingScheduler定时任务及其他方式的实现,具体如下: #BlockingScheduler定时任务 from apscheduler.schedulers.b ...
- python和R文件IO操作对比及dataframe创建方式对比:read_csv、to_csv、write.csv、 data.frame、pd.DataFrame
python和R文件IO操作对比及dataframe创建方式对比 很多工程师可能刚开始的时候只熟悉python或者R其中的一个进行数据科学相关的任务. 那么如果我们对比这学习可以快速了解语言设计背后的 ...
- 元素隐藏的三种方式对比(针对移动端项目中的按钮,先隐藏且不能被点击 visibility:hidden)
元素隐藏的三种方式对比 display:none opacity:0 visibility:hidden 项目需求 表面一个图片遮罩,鼠标hover遮罩消失,内部元素展现,其中有一个按钮在移动端是手指 ...
- php mysql 连接方法 对比_Mysql实例php连接MySQL的两种方式对比
<Mysql实例php连接MySQL的两种方式对比>要点: 本文介绍了Mysql实例php连接MySQL的两种方式对比,希望对您有用.如果有疑问,可以联系我们. MYSQL数据库记录一下P ...
- mui几种页面跳转方式对比
mui几种页面跳转方式对比 http://blog.csdn.net/uikoo9/article/details/44676963 [几种打开页面的方式] 1.初始化时创建子页面 2.直接打开新页面 ...
- 【转】Azure应用部署方式对比
如图 azure环境应用托管方式对比 1. app service + serverless azure的app service支持几乎所有语言开发的web app,既可以手动使用publish pr ...
- python做定时任务的方式及优缺点_Python3-定时任务四种实现方式
最近做一个小程序开发任务,主要负责后台部分开发:根据项目需求,需要实现三个定时任务: 1>定时更新微信token,需要2小时更新一次: 2>商品定时上线: 3>定时检测后台服务是否存 ...
- android注册广播两种方式,Android 注册广播的两种方式对比
Android 注册广播的两种方式对比 1.常驻型广播 常驻型广播,当你的应用程序关闭了,如果有广播信息来,你写的广播接收器同样的能接受到, 他的注册方式就是在你的应用程序中的AndroidManif ...
- python3 定时任务_Python3.x:定时任务实现方式
Python3.x下实现定时任务的方式有很多种方式. 一.循环sleep: 最简单的方式,在循环里放入要执行的任务,然后sleep一段时间再执行.缺点是,不容易控制,而且sleep是个阻塞函数 def ...
- 【总结】实现点击累加效果的几种方式对比
//实现点击累加效果的几种方式对比Author:李金涛:Time:2018-1-1(新年新气象,更上一层楼.持续写博客.不断总结优化,博观约取,才能厚积薄发!)// 1,利用全局作用域不销毁的原理,把 ...
最新文章
- 关于ie,火狐,谷歌浏览器滚动条的隐藏以及自定义样式
- mysql的status状态说明
- php使用mysql怎么连接浏览器_一个简单的php实现的MySQL数据浏览器
- 保利协鑫多晶硅产量再创历史记录
- Spring MVC @ModelAttribute 数据绑定
- FileReader上传图片
- SAP Spartacus 里的 .release-it.json 文件
- C#:WinForm无边框窗体移动方法、模仿鼠标单击标题栏移动窗体位置
- JFinal 源码导读第四天(3) initRender
- Facebook正式改名Meta,一个元宇宙新纪元由此开始
- 前端7大常用布局方式
- Windows开发入门:工具-WinDbg的安装和使用教程
- 抖音、猫眼网页信息加密分析与应对(1)
- 从菜鸟到架构师(一)
- 程序员如何修炼成系统分析员
- @EventListener注解使用及源码解析
- Nginx和Apache和Tomcat的区别及优缺点
- fluke福禄克8000|8508A|8808A|8845A|8846A数字万用表软件NS-Multimeter
- 单例设计模式与final关键字
- 服务器pci-e硬盘,机械/混合/固态/PCI-E硬盘解析