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 ...
随机推荐
- Linux性能优化实战学习笔记:第五十讲
一.上节回顾 上一节,我以 ksoftirqd CPU 使用率高的问题为例,带你一起学习了内核线程 CPU 使用率高时的分析方法.先简单回顾一下. 当碰到内核线程的资源使用异常时,很多常用的进程级性能 ...
- MySQL实战45讲学习笔记:第二十一讲
一.引子 在上一篇文章中,我和你介绍了间隙锁和 next-key lock 的概念,但是并没有说明加锁规则.间隙锁的概念理解起来确实有点儿难,尤其在配合上行锁以后,很容易在判断是否会出现锁等待的问题上 ...
- [LeetCode] 113. Path Sum II 二叉树路径之和之二
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- 《30天自制操作系统》笔记4 --- (Day2 下节)了解如何用汇编写操作系统中的HelloWorld
关于上一节,我测试了发现3e.4c.4e都OK ,4b 4d 4f都进不去系统还把qemu卡死了. 50不会输出HelloWorld,可能需要hex偶数且在0x3e~4f区间吧.上节复制并运行命令如下 ...
- 关于ENVI5.0菜单栏不能正常显示(win7 x86系统)
在安装了envi5.0之后,打开显示的并不是之前4.8版本的样式也就罢了,还不能正常的将菜单栏显示出来. 上网搜了下,发现又是一个是版本兼容的问题 解决: 找到Envi5.0 右键---属性---兼容 ...
- Unity调用windows系统dialog 选择文件夹
#region 调用windows系统dialog 选择文件夹 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public ...
- Base64和本地以及在线图片互转
package com.ruoyi.common.utils; import java.io.ByteArrayOutputStream; import java.io.FileInputStream ...
- Kafka学习笔记1——Kafka的安装和启动
一.准备工作 1. 安装JDK 可以用命令 java -version 查看版本
- 关于toLocaleString(), toString(), valueOf()方法的使用
所有对象都是具有toLocalString(), toString(), valueOf()三种方法的,此篇博客主要是讲述其在Array引用类型上的使用. 基本使用 调用valueOf()返回的是数组 ...
- EF Core中的DB First与Code First
前言: 大家都习惯在程序中生成对应的model来对数据库进行操作,所以如何快速的生成数据库表的对应model,是基础之一.总结了一下在我的认知中大概是这个结构: Db first方式: 先创建好对应的 ...