当前位置: 首页 > news >正文

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

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

http://www.dtcms.com/a/426708.html

相关文章:

  • 【数据结构】二叉树的数组表示推导
  • 前端版本更新,错误监控,解决方案 error / unhandledrejection,同步异步错误监控方案
  • 2023 美赛C Predicting Wordle Results(上)
  • 微退休(Micro-retirement)介绍
  • LeetCode热题100(1-7)
  • 想让图片可以在Word和WPS文档中自由移动?修改文字环绕
  • 连云港网站设计北京seo优化分析
  • PostgreSQL WAL 日志发展史 - pg9
  • 企业自有网站全国加盟网站大全
  • 做金融网站看那些素材怎样联系自己建设网站
  • Java的任务调度框架之 Quartz 以及 CronTrigger,CronScheduleBuilder 和 Cron表达式 笔记250930
  • 联想乐享重构智能搜索生态:ThinkPad T14p 2025升级信息首触“企业智能双胞胎”
  • 明远智睿 SSD2351 核心板:64 位四核含税不足 50 元,批量采购新选择
  • Flutter 自定义 View 权威指引
  • AWS | Linux 硬盘挂载综合教程
  • ntdll.pdb 包含查找模块 ntdll.dll 的源文件所需的调试信息
  • 精读C++20设计模式——行为型设计模式:策略模式
  • Spark专题-第三部分:性能监控与实战优化(1)-认识spark ui
  • 汕头网站设计哪家好鞍山制作网站哪家好
  • 电子商务网站建设试卷软件设计师好考吗
  • 【计算机视觉】形态学的去噪
  • 精读C++20设计模式——行为型设计模式:命令模式
  • petalinux 安装Openblass库
  • 织梦播放器网站网站建设简历自我评价
  • 大数据毕业设计选题推荐-基于大数据的全球经济指标数据分析与可视化系统-Hadoop-Spark-数据可视化-BigData
  • Spring Boot 整合 Redisson 实现分布式锁:实战指南
  • 国鑫发布新一代「海擎」服务器 全面兼容国内外主流OAM GPU
  • 百度电商MultiAgent视频生成系统
  • FRP v0.65.0 内网穿透专业指南(SSH + HTTP/HTTPS 一体化配置)
  • UNIX下C语言编程与实践20-UNIX 文件类型判断:stat 结构 st_mode 与文件类型宏的使用实战