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

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

相关推荐
BestAns9 小时前
一文带你吃透 Java 反射机制
java·后端
沐知全栈开发9 小时前
HTML5 浏览器支持
开发语言
wasp5209 小时前
AgentScope Java 核心架构深度解析
java·开发语言·人工智能·架构·agentscope
WHOVENLY10 小时前
【javaScript】- 笔试题合集(长期更新,建议收藏,目前已更新至31题)
开发语言·前端·javascript
2501_9167665410 小时前
【Springboot】数据层开发-数据源自动管理
java·spring boot·后端
慌糖10 小时前
流-为序列化解释
开发语言
半夏知半秋10 小时前
docker常用指令整理
运维·笔记·后端·学习·docker·容器
自在极意功。10 小时前
MyBatis 动态 SQL 详解:从基础到进阶实战
java·数据库·mybatis·动态sql
软件管理系统10 小时前
基于Spring Boot的便民维修管理系统
java·spring boot·后端
LXS_35710 小时前
Day 18 C++提高 之 STL常用容器(string、vector、deque)
开发语言·c++·笔记·学习方法·改行学it