【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没阻塞

如果定时器线程没在阻塞 就正在对 现队列队首 去查取执等

相关推荐
我命由我1234516 小时前
Android 开发 - Android JNI 开发关键要点
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
树在风中摇曳17 小时前
C语言动态内存管理:从基础到进阶的完整解析
c语言·开发语言·算法
YG亲测源码屋17 小时前
怎么让自己的网址被百度收录(网站如何被百度收录进去)
java·百度·dubbo
风筝在晴天搁浅17 小时前
代码随想录 Q89.跳跃游戏Ⅱ
java
mjhcsp17 小时前
C++ 高精度计算:突破数据类型限制的实现与应用
开发语言·c++·算法·高精度
lixinnnn.17 小时前
C++: map和set
开发语言·c++
郝学胜-神的一滴17 小时前
Qt QPushButton 样式完全指南:从基础到高级实现
linux·开发语言·c++·qt·程序人生
沐知全栈开发17 小时前
R MySQL 连接
开发语言
流川_疯17 小时前
CANOE概念与应用
经验分享·笔记·学习·汽车
tryxr17 小时前
变量捕获相关内容
java·开发语言·jvm