Timer的源码分析
这段时间用到了Timer做一个定时任务,因为业务的原因就需要调计算机的时间,发现一个问题把时间先调大于当前时间在调回来发现timer就没有执行了,感觉Timer不会这么坑吧,所以就看了一下源码。下面就把我理解Timer的分享一下
先看Timer类的结构里面内置二个重要的组件TimerThread(定时线程)和TaskQueue(任务队列)下面是Timer的部分源码
我们现在分析类TimerThread
TimerThread是Thread的子类,里面内置TaskQueue对象,实现Runnable接口的run方法
在看看mainLoop方法
上面的方法告诉我们只要TaskQueue里面为空并且newTasksMayBeScheduled为true的话,这个线程一直处于等待状态。如果队列为空newTasksMayBeScheduled为false时候该线程就直接跑完了,其他情况的话先从任务队列里面取出下标为1的元素,计算一下当前时间和下个周期执行时间那个大,然后当前时间大于或等于下个一个周期执行时间
话,先计算个下下个执行周期时间然后跟新任务队列,并执行这个任务,否则直接等待(executionTime-currentTime)这个周期。然后在循环上面操作(读到这里当时我有个疑问是为什么下标为1的任务为什么是最近要执行的job,其实这个与TaskQueue这个类添加元素有关,下面会分析这个类)
TaskQueue类里面有个TimerTask数组queue,核心方法有add(TimerTask task),getMin(),rescheduleMin(long newTime),fixUp(int k),fixDown(int k)下面我们一一分析
上图是fixDown和fixUp的源码。其实这里保证了当添加一个元素的时候和修改一个元素的下个执行周期的时候所有的子节点都大于或等于父节点
这个方法会在TimerThread中的mainLoop方法里被调用,当取出的任务的下一个执行时间大于等于当前时间的话会调用这个方法,因为在执行task的同时,需要修改计算这个任务的下个周期执行时间,并放到队列里面并要维护TaskQueue的特性(子节点的下个执行周期一定要大于父节点的执行周期)。这样保证getMin的时候取到的下个执行周期是最近的。
getMin的源码
现在介绍这二个主要的类,我们在看Timer类
我们
当我们添加一个TimerTask的时候会调用上面方法,加到TaskQueue队列中,与TimerThread的mainLoop不断重复处理
在Timer的开发中在编码自己的TimerTask任务的时候注意要处理自己的异常,从上面的源码的可以知道他是一个主线程中循环处理queue里面的任务的,然后在执行的你的代码抛出异常的时候会导致整个定时任务崩溃不能正常工作
Timer的源码分析相关推荐
- 【Android 异步操作】Timer 定时器 ( Timer 与 TimerTask 基本使用 | Timer 定时器常用用法 | Timer 源码分析 )
文章目录 一.Timer 定时器基本使用 二.Timer 定时器常用用法 三.Timer 源码分析 四.Timer 部分源码注释 五.源码及资源下载 参考文档 : Timer 定时器 API 文档 T ...
- Java定时任务(一) Timer及TimerTask的案例解析及源码分析
Java定时任务(一) Timer及TimerTask的案例解析及源码分析 一.概述: 定时任务这个概念在Java的学习以及项目的开发中并不陌生,应用场景也是多种多样.比如我们会注意到12306网站 ...
- java刷卡计时计次源码美萍_Java 定时调配 Timer 类和定任务 TimerTask 类(一篇详细且完整的源码分析以及四种简单的使用方法)...
前言 在我们日常生活中,我们常常会遇到有关计时器的事情.如商城类项目会在某年某月某日某时某分某秒进行特价活动,那么当时间到达这个时间点上的时候该事件就会触发. 1.Timer 类构造函数摘要 1 Ti ...
- Redis源码分析:基础概念介绍与启动概述
Redis源码分析 基于Redis-5.0.4版本,进行基础的源码分析,主要就是分析一些平常使用过程中的内容.仅作为相关内容的学习记录,有关Redis源码学习阅读比较广泛的便是<Redis设计与 ...
- golang源码分析-调度概述
golang源码分析-调度过程概述 本文主要概述一下golang的调度器的大概工作的流程,众所周知golang是基于用户态的协程的调度来完成多任务的执行.在Linux操作系统中,以往的多线程执行都是通 ...
- Nginx源码分析:epoll事件处理模块概述
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> 事件处理模块概述 Nginx的高效请求的处理依赖于事件管理机制,本次默认的场景是Linux操 ...
- Nginx源码分析:惊群处理与负载均衡
nginx源码分析 nginx-1.11.1 参考书籍<深入理解nginx模块开发与架构解析> Nginx的惊群处理与负载均衡概述 当Nginx工作在master/worker模式下时,就 ...
- djangorestframework源码分析1:generics中的view执行流程
djangorestframework源码分析 本文环境python3.5.2,djangorestframework (3.5.1)系列 djangorestframework源码分析-generi ...
- celery源码分析-Task的初始化与发送任务
celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery的任务发送 在Django项目中使用了装饰器来包装待执行任务, from cel ...
- celery源码分析-worker初始化分析(下)
celery源码分析 本文环境python3.5.2,celery4.0.2,django1.10.x系列 celery的worker启动 在上文中分析到了Hub类的初始化,接下来继续分析Pool类的 ...
最新文章
- JS 实现下载Blod文件
- php字符串常用算法--字符串加密解密
- 合肥python培训-在合肥学习Python去哪
- wgrib读grib数据
- Android4.0/Android4.1 WifiStateMachine状态机结构图
- MySQL中MVCC+行级锁的工作机制(源码佐证)
- X86 CPU特性之(2)-eagerfpu
- Android -- 图片画画板(canvas、paint、bitmap)
- sublime配置python2和3_请教各位,关于sublime text3 配置python环境的两个小问题。
- CMSIS-SVD Schema File Ver. 1.0
- 基于CentOS7配置ArcGIS enterprise
- SQL:MySQL创建、删除事件
- mybatis系列-tkmybatis-04-SpringBoot整合TkMybatis+PageHelper实现分页查询
- matlab-FCM模糊聚类
- 中创向心力:如何打造打造职业教育技术技能创新服务平台!
- Data must be padded to 16 byte boundary in CBC mode
- 【教你如何在Win7上安装lls】
- 《追寻生命的意义》--后记
- 参考三:容易误解读的量子擦除实验
- MySQL--常见业务/笔试题