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

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

相关推荐
智鸟科技GemeOpen开发者智能设备几秒前
GemeOpen 智能音箱 GSSM0B - 播放控制(Java示例)
java·开发语言·智能音箱
今天的砖头有点烫手啊19 分钟前
Java IO/NIO/AIO 演进:从 BIO 到 Netty 的底层逻辑
java·jvm·nio
m0_380743871 小时前
PHP 8.3 接口返回数据为空怎么排查
开发语言·php
谢亮_vipxieliang1 小时前
Java 21 新特性实战:Record、Sealed、模式匹配
java·开发语言
霸道流氓气质1 小时前
LLM 应用限流与熔断机制完全指南:从多层防护架构到Java生产级弹性实战
java·开发语言·架构
大侠归来1 小时前
C语言内存管理:从栈到堆的完整指南
c语言·开发语言·python
m0_380743871 小时前
PHP7.0字符串在Docker怎么用
开发语言·php
不会就选b1 小时前
算法日常・每日刷题--<动态规划>1
java·数据结构·算法
晚安code1 小时前
JVM 内存结构入门:程序计数器、虚拟机栈、本地方法栈与堆的溢出诊断
java·jvm
自强的小白2 小时前
Spring事务失效的场景
java·spring