【Java学习】定时器Timer(源码详解)
目录
一、构造方法
1.非静态成员就地初始化
1.1TaskQueue类
1.1.1构造(在Timer成员初始化时)
TimerTask类
1.2TimerThread类
1.2.1构造(在Timer成员初始化时)
1.2.2start(在Timer构造方法体时)
1.2.3run
1.2.3.1队列空任务
1.2.3.2队列有任务
1.2.3.2.1时间已到
1.2.3.2.2时间未到
2.构造方法体执行
二、schedule方法
1.计算执行时刻
2.任务加入队列
3.通知定时器线程
3.1意义
3.1.1在阻塞
3.1.2没阻塞
Timer类
一、构造方法
Timer类实例化创建对象,在构造方法里进行 非静态成员就地初始化 和 构造方法体执行 的构造初始化:
1.非静态成员就地初始化
进行非静态成员TaskQueue、TimerThread的就地初始化:
1.1TaskQueue类
1.1.1构造(在Timer成员初始化时)
创建一个 里面非静态存储 以执行时刻优先级顺序 存储定时器任务的 TimerTask数组 的任务队列TaskQueue
TimerTask类
定时器任务TimerTask 抽象类 抽象实现 Runnable可运行接口,里面非静态成员nextExcutionTime预期执行时间 存储该任务执行的时刻
1.2TimerThread类
1.2.1构造(在Timer成员初始化时)
创建一个 构造传 上面就地初始化刚创建好的 Timer类非静态成员任务队列TaskQueue 到TimerThread类的构造方法体中 赋值给TimerThread的非静态任务队列成员TaskQueue 的定时器线程TimerThread
1.2.2start(在Timer构造方法体时)
定时器线程TimerThread 继承实现类Thread, 调用父类Thread的start 即启动线程 调用父类的run 向下重写执行TimerThread的run
1.2.3run
以非静态成员任务队列为锁,持续 对非静态任务队列成员 队列队首 查看、等待、取出、执行 最早的定时器任务
1.2.3.1队列空任务
队列空任务 厌锁阻塞 等待安排任务时来的唤醒
1.2.3.2队列有任务
队列有任务 优先级查看 最早定时器任务 的执行时刻 与 此时刻 比较 是否已到时:
1.2.3.2.1时间已到
执行时间已到 便从任务队列取出 此定时器任务 并调用run地 方法执行任务内容
1.2.3.2.2时间未到
执行时间未到 就厌锁等待 差时到后 再自动唤醒 去取执行
2.构造方法体执行
构造方法体中 启动定时器线程 开始持续 对非静态任务队列成员 队列队首 查取执等 最早的定时器任务
二、schedule方法
Timer类的非静态方法schedule,调用去安排任务时,以非静态成员任务队列为锁:
1.计算执行时刻
将定时器任务里面的 非静态成员nextExecutionTime 赋上 安排时刻 + 延迟时间 为 执行时刻
2.任务加入队列
将 定时器任务 加入进 非静态成员任务队列 里的 优先级数组
3.通知定时器线程
通知 同样以相同任务队列加锁的 定时器线程,唤醒 队列无任务阻塞 与 等差时阻塞
3.1意义
schedule安排定时器任务 进任务队列后 已经上队列结构里去了,需要定时器线程 现在查看队列队首 是否换元素 而去换等对 上面的 会更早先执行的 任务,所以之后去通知定时器线程:
3.1.1在阻塞
如果定时器线程正在阻塞 便醒来 去对现队列 查取队首去执等
3.1.2没阻塞
如果定时器线程没在阻塞 就正在对 现队列队首 去查取执等