Java.util.timer的实现——初步解析
来源:互联网 发布:快手字幕软件 编辑:程序博客网 时间:2024/06/07 12:15
整理自(点击打开链接)
一、timer综述
public class Timer extends Object
一种工具,线程用其安排以后在后台线程中执行的任务。可安排任务执行一次,或者定期重复执行。
与每个 Timer 对象相对应的是单个后台线程,用于顺序地执行所有计时器任务。计时器任务应该迅速完成。如果完成某个计时器任务的时间太长,那么它会“独占”计时器的任务执行线程。因此,这就可能延迟后续任务的执行,而这些任务就可能“堆在一起”,并且在上述不友好的任务最终完成时才能够被快速连续地执行。
对 Timer 对象最后的引用完成后,并且所有未处理的任务都已执行完成后,计时器的任务执行线程会正常终止(并且成为垃圾回收的对象)。但是这可能要很长时间后才发生。默认情况下,任务执行线程并不作为守护线程来运行,所以它能够阻止应用程序终止。如果调用者想要快速终止计时器的任务执行线程,那么调用者应该调用计时器的 cancel 方法。
Timer由三部分组成:
1. 任务——TimerTask
2. 任务队列——TaskQueue queue
3. 任务调度者——TimerThread thread
他们的关系如下所示:
如图所示,
1. Timer是面向开发者的接口。
2. 所有添加给timer的任务都会被放入一个taskqueue类型的任务队列中。
3. 任务调度由timerthread负责。
二、组件介绍
1. 任务——TimerTask
TimerTask为任务单元实体类
比较重要的两个成员变量
(1) Long nextExecutionTime
(2) Long period=0;
nexitExecutionTime用来记录任务下次的执行时间,格式与System.currentTimeMillis()一致。这个值作为任务队列(queue)中任务排序的依据,任务调度者(thread)会在执行每个任务时对这个值作处理,重新计算任务下次的执行时间并重新赋值。
Period用以描述任务执行方式,0表示不重复执行的任务,正数表示固定频率执行的任务,负数表示固定延迟执行的任务。
(固定频率:不考虑任务本身的执行时间,始终从开始时间算起每period执行下一次;固定延迟:考虑任务本身的执行之间,在上一次执行后period执行下一次)
2. 任务队列TaskQueue
任务队列是一个数组,用平衡二叉堆来实现优先级调度并且是一个小顶堆,queue[n]的孩子节点是queue[2*n]和queue[2*n+1]
优先级由TimerTask的nextExecutionTime来排序。
对于堆的任意节点n和他的任意子孙节点d,一定有:n.nextExecutionTime<=d.nextExecutionTime
3. 任务调度者TimerThread
成员变量 newTasksMayBeScheduled 用来表示是否需要继续等待新任务。
默认情况下这个变量是true,且一直都是true,只有以下两种情况下会变成false:
(1) 当调用timer的cancel方法
(2) 没有指向这个timer对象的引用时
类方法mainloop()用来执行任务调度,源码可参见点击打开链接中详细描述。
- Java.util.timer的实现——初步解析
- java.util.Timer 初步了解
- java.util.Timer解析...
- 任务调度——java.util.Timer
- timer实现的呼吸灯效果——初步
- java.util.Timer 的使用
- java.util.Timer类可以实现多线程一样的功能
- 任务调度--使用java.util.Timer实现
- java.util.Timer的使用实例
- java.util.Timer类的使用
- java.util.Timer的一个构造方法
- java.util.timer的 schedule方法
- 关于java.util.Timer的释放
- 使用java.util.Timer
- 使用java.util.Timer
- 使用java.util.Timer
- 使用java.util.Timer
- java.util.Timer 例子
- 黑马程序员IOS-OC语言-点语法、@property
- 求两个单向链表的交点
- linux内存管理各文件简介
- 摄影测量与遥感专业、大地测量与测量工程专业学术期刊论文推荐发表
- C++中读写文件过程中异常处理机制
- Java.util.timer的实现——初步解析
- colors绘图区报表的颜色值
- Lucene学习之Facet
- 服务器中部署asp.net WebService
- 整合spring4和hibernate4出现问题———"hibernate.dialect” not set
- android仿新浪微博随便看看
- C#中M的N次方显示
- 单例模式
- IOS-IOS8小计