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

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

相关推荐
Refrain_zc37 分钟前
Android 音视频通话核心 —— 音频编码(AAC)完整解析
java
xiaoshuaishuai81 小时前
C# AvaloniaUI 资源找不到报错
java·服务器·前端·windows·c#
Xin_ye100861 小时前
C# 零基础到精通教程 - 第十八章:部署与发布——让应用上线
开发语言·c#
我是唐青枫1 小时前
Java JdbcTemplate 实战指南:用 Spring 轻量完成数据库增删改查
java·数据库·spring
思麟呀1 小时前
C++11并发编程:call_once一次性执行+atomic原子类型+CAS无锁编程+自旋锁
linux·开发语言·jvm·c++·windows
Lumbrologist2 小时前
【C++】零基础入门 · 第 13 节:类与对象基础
java·c++·算法
humors2212 小时前
学习方法的系统梳理与实践应用
学习·学习方法
码不停蹄的玄黓2 小时前
Java 生产者-消费者模型详解
java·开发语言·python
爱讲故事的2 小时前
操作系统第一讲复习:为什么学习操作系统,以及操作系统到底在做什么?
linux·开发语言·windows·学习·ubuntu·c#
笨蛋不要掉眼泪2 小时前
Java并发编程:Executors框架类深度解析
java·开发语言·并发