Java多线程编程核心技术-第5章-定时器 Timer-读书笔记
第 5 章 定时器 Timer
定时 / 计划功能在移动开发领域使用较多,比如 Android 技术。定时计划任务功能在 Java 中主要使用的就是 Timer 对象,他在内部使用多线程的方式进行处理,所以它和线程技术还是有非常大的关联的。
本章主要内容
如何实现指定时间执行任务。
如何实现按指定周期执行任务。
5.1 定时器 Timer 的使用
在 JDK 库中 Timer 类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务。
Timer 类的方法列表:

Timer 类的主要作用就是设置计划任务,但封装任务的类却是 TimerTask。
类 TimeTask 类相关的信息:
执行计划任务的代码要放入 TimerTask 的子类中,因为 TimerTask 是一个抽象类。
5.1.1 方法 schedule(TimerTask,Date time)的测试
该方法的作用是在指定的日期执行一次某一任务。
1.执行任务的时间晚于当前时间:在未来执行的效果
当执行任务的时间是晚于当前时间的,等到计划的时间,TimerTask 中的任务会被执行,但是任务执行完了,但进程还未销毁。
创建一个 Timer 就是启动一个新的线程,新启动的线程并不是守护线程,所以它一直在运行。
选择守护线程进行运行,程序运行后迅速结束当前的进程,并且 TimerTask 中的任务不再被运行,因为进程已经结束了。
2.计划时间早于当前时间:提前运行的效果
如果执行任务的时间早于当前时间,则立即执行 task 任务。
3.多个 TimerTask 任务及延时的测试
Timer 中允许由多个 TimerTask 任务。
TimerTask 是以队列的方式一个一个被顺序执行的,所以执行的时间有可能和预期的时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务运行的时间也会被延迟。
5.1.2 方法 schedule(TimerTask task,Date firstTime,long period)的测试
该方法的作用是在指定的日期之后,按指定的间隔周期性地无限循环地执行某一任务。
1.计划时间晚于当前时间:在未来执行的效果
等到了计划的时间,每隔间隔时间运行一次 TimerTask 任务,并且是无限期地重复执行。
2.计划时间早于当前时间:提前运行的效果
如果计划时间早于当前时间,则立即执行 task 任务。每隔间隔时间运行一次 TimerTask 任务,并且是无限期地重复执行。
3. 任务执行时间被延时
当任务需要运行的时间大于间隔时间时,任务是以任务运行的时间为间隔循环运行。
4. TimerTask 类的 cancel() 方法
TimerTask 类中的 cancel() 方法的作用是将自身从任务队列中清除。
TimerTask 类的 cancel() 放啊是将子什么从任务队列中被移除,其他任务不受影响。
5. Timer 类的 cancel() 方法
和 TimerTask 类中的 cancel() 方法清除自身不同,Timer 类中的 cancel() 方法的作用是将任务队列中的全部任务清空。
全部任务都被清除,并且进程被销毁。
6. TImer 的 cancel() 方法注意事项
Timer 类中的 cancel() 方法有时并不一定会停止执行任务之花,而是正常执行。
这是因为 Timer 类中的 cancel() 方法有时并没有争抢到 queue 锁,所以 TimerTask 类中的任务继续正常执行。
5.1.3 方法 schedule(TimerTask task,long delay) 的测试
该方法的作用是以执行 schedule(TimerTask task,long delay) 方法当前的时间为参考时间,在此时间基础上延迟指定的毫秒数后执行一次 TimerTask 任务。
5.1.4 方法 schedule(TimerTask task,long delay,long period) 的测试
该方法的作用是以执行 schedule(TimerTask task,long delay,long period) 方法当前的时间为参考时间,在此时间基础上延迟执行的毫秒数,再以某一间隔时间无限次数地执行某一任务。
凡是使用方法中带有 period 参数的,都是无限循环执行 TimerTask 中的任务。
5.1.5 方法 scheduleAtFixedRate(TimerTask task,Date firstTime,long period) 的测试
方法 schedule 和方法 scheduleAtFixedRate 都会按顺序执行,所以不要考虑非线程安全的情况。
方法 schedule 和 scheduleAtFixedRate 主要的区别只在于不延时的情况。
使用 schedule 方法:如果执行任务的时间没有被延时,那么下一次任务的执行时间参考的是上一次任务的“开始”时的时间来计算。
使用 scheduleAtFixedRate 方法:如果执行任务的时间没有被延时,那么下一次任务的执行时间参考的是上一次任务的“结束”时的时间来计算。
延时的情况则没有区别,也就是使用 schedule 或 scheduleAtFixedRate 方法都是如果执行任务的时间被延时,那么下一次任务的执行时间参考的是上一次任务“结束”时的时间来计算。
1.测试 schedule 方法任务不延时
在不延时的情况下,如果执行任务的时间没有被延时(执行任务的时间小于 delay 的时间),则下一次执行任务的时间是上一次任务的开始时间加上 delay 时间。
2.测试 schedule 方法任务延时
如果执行任务的时间被延时(执行任务的时间大于 delay 的时间),那么下一次任务的执行时间以上一次任务“结束”时的时间为参考来计算。
3.测试 scheduleAtFixedRate 方法任务不延时
如果执行任务的时间没有被延时(执行任务的时间小于 delay 的时间),则下一次认知性任务的时间是上一次任务的开始时间加上 delay 时间。
4.测试 scheduleAtFixedRate 方法任务延时
如果执行任务的时间被延时(执行任务的时间大于 delay 的时间),那么下一次任务的执行时间以上一次任务“结束”时的时间为参考来计算。
5.验证 schedule 方法不具有追赶执行性
任务计划时间早于当前时间,而任务计划时间到当前时间之间的时间所对应的 Task 任务被取消了,不执行了。这就是 Task 任务不追赶的情况。
6. 验证 scheduleAtFixedRate 方法具有追赶执行性
任务计划时间早于当前时间,而任务计划时间到当前时间之间的时间所对应的 Task 任务被“补充性”执行了,这就是 Task 任务追赶执行的特性。
5.2 本章总结
通过本章的学习,应该掌握如何在 Java 中使用定时任务的功能,并且可以对这些定时任务使用指定的 API 进行处理。
Java多线程编程核心技术-第5章-定时器 Timer-读书笔记的更多相关文章
- Java多线程编程核心技术-第7章-拾遗增补-读书笔记
第 7 章 拾遗增补 本章主要内容 线程组的使用. 如何切换线程状态. SimpleDataFormat 类与多线程的解决办法. 如何处理线程的异常. 7.1 线程的状态 线程对象在不同的运行时期有不 ...
- Java多线程编程实战指南(核心篇)读书笔记(五)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(四)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(三)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(二)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程实战指南(核心篇)读书笔记(一)
(尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...
- Java多线程编程核心技术-第1章-Java多线程技能-读书笔记
第 1 章 Java 多线程技能 本章主要内容 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 1.1 进程和多线程的概念及线程的优点 进程是操作系统结构的基础:是一次程 ...
- Java多线程编程核心技术-第4章-Lock的使用-读书笔记
第 4 章 Lock 的使用 本章主要内容 ReentrantLocal 类的使用. ReentrantReadWriteLock 类的使用. 4.1 使用 ReentrantLock 类 在 Jav ...
- java多线程编程核心技术——第五章总结
定时器Timer的使用 1.1方法schedule(TimerTask task, Date time)的测试 1.2方法schedule(TimerTask task, Date firstTime ...
随机推荐
- 《30天自制操作系统》笔记2 --- 初步了解汇编产生的二进制(Day1)
nask.exe应该就是nas kit(nas开发工具的意思),由于这个编译器是作者自己写的,所以这种汇编语言应该是作者改造出来的,所以我叫它nas汇编语言. 作者说nask是模仿nasm语法的,关于 ...
- Django文件上传【单个/多个图片上传】
准备工作 python:3.6.8 django:2.2.1 新建django项目 确定项目名称.使用的虚拟环境[当然这个也可以后期修改].app的名称 创建成功,选择在新的窗口中打开 图片上传 修改 ...
- Java连载15-boolean类型&类型转换&++运算符
一.boolean类型 1.说明: (1)在java语言中,boolean类型只有两个值:true.false,没有其他的值.在C语言中,是有0代表false和1代表true的 (2)在底层存储的时候 ...
- 如何用代码设置机器人初始坐标实现 2D Pose Estimate功能
前言:ROS机器人有时候会遇到极端的情况:比如地面打滑严重,IMU精度差,导致积累误差严重,或是amcl匹配错误,导致机器人定位失败, 这时候如何矫正机器人位置变得非常重要,我的思路是利用相机或是在地 ...
- SPA框架 Angular、React、Vue
指尖前端重构(React)技术调研分析 摘要:重构前的技术文档调研与分析,包括技术选型为什么选择react,应用过程中的注意事项等. 一.为什么选择React React是当前前端应用最广泛的框架 ...
- js、jscore与webkit、nodejs的关系
js:编程语言 jscore:js语言的解释执行引擎,代表cpu: webkit.nodejs:js语言的运行平台,代表操作系统.计算机资源.
- Blend 硬货 绑定
原文:Blend 硬货 绑定 开始讲一点 硬技能 怎么用Blend实现绑定 效果 详细说一下绑定 1)default 2)OneTime 3) One Way 4)TwoWay 5) OneWayto ...
- android版本对应表
API Level 最初Android版本 Linux内核版本 首次发布日期 后续Android版本 28 9 Unknown 2018-07-02(Beta 3) - 27 8.1 4.10 201 ...
- python 进程和线程-简介及进程
进程和线程的关系及应用 参考链接:https://www.liaoxuefeng.com/wiki/1016959663602400/1017627212385376 多任务: 什么叫“多任务”呢?简 ...
- Kubernetes CNI网络插件
CNI 容器网络接口,就是在网络解决方案由网络插件提供,这些插件配置容器网络则通过CNI定义的接口来完成,也就是CNI定义的是容器运行环境与网络插件之间的接口规范.这个接口只关心容器的网络连接,在创建 ...