深入解析:【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没阻塞

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

posted on 2025-10-02 09:52  slgkaifa  阅读(6)  评论(0)    收藏  举报

导航