第 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-读书笔记的更多相关文章

  1. Java多线程编程核心技术-第7章-拾遗增补-读书笔记

    第 7 章 拾遗增补 本章主要内容 线程组的使用. 如何切换线程状态. SimpleDataFormat 类与多线程的解决办法. 如何处理线程的异常. 7.1 线程的状态 线程对象在不同的运行时期有不 ...

  2. Java多线程编程实战指南(核心篇)读书笔记(五)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76730459冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  3. Java多线程编程实战指南(核心篇)读书笔记(四)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76690961冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  4. Java多线程编程实战指南(核心篇)读书笔记(三)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76686044冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  5. Java多线程编程实战指南(核心篇)读书笔记(二)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76651408冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  6. Java多线程编程实战指南(核心篇)读书笔记(一)

    (尊重劳动成果,转载请注明出处:http://blog.csdn.net/qq_25827845/article/details/76422930冷血之心的博客) 博主准备恶补一番Java高并发编程相 ...

  7. Java多线程编程核心技术-第1章-Java多线程技能-读书笔记

    第 1 章 Java 多线程技能 本章主要内容 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 1.1 进程和多线程的概念及线程的优点 进程是操作系统结构的基础:是一次程 ...

  8. Java多线程编程核心技术-第4章-Lock的使用-读书笔记

    第 4 章 Lock 的使用 本章主要内容 ReentrantLocal 类的使用. ReentrantReadWriteLock 类的使用. 4.1 使用 ReentrantLock 类 在 Jav ...

  9. java多线程编程核心技术——第五章总结

    定时器Timer的使用 1.1方法schedule(TimerTask task, Date time)的测试 1.2方法schedule(TimerTask task, Date firstTime ...

随机推荐

  1. [LeetCode] 1028. Recover a Tree From Preorder Traversal 从先序遍历还原二叉树

    We run a preorder depth first search on the rootof a binary tree. At each node in this traversal, we ...

  2. oracle--BBED (dump 深入实践三)

    一,工具介绍 bbed是Block Browser and Editor(块浏览编辑器)的缩写,它是Oracle数据库在安装时一起附带的工具. 一般此工具倾向于仅作为Oracle内部使用,且Oracl ...

  3. 表单只有一项 input 时按回车键会提交表单

    在 Vue 中 使用 Element UI,使用表单  el-form 只有一个  el-input  项,使用  @keyup.enter.native 来处理回车事件. 结果发现按下回车时页面总会 ...

  4. Spring boot使用influxDB总结

    项目中需要存放大量设备日志,且需要对其进行简单的数据分析,信息提取工作. 结合众多考量因素,项目决定使用时序数据库中的领头羊InfluxDB. 引入依赖 项目中使用influxdb-java,在pom ...

  5. 是时候解决 students's Test 假设检验(显著性检验)了

    T test 由来已久 T 检验的概念 假设检验的步骤 假设检验可以分为三步: 建立检验假设和确定检验水准 单侧检验与双侧检验 选定检验方法和计算检验统计量 确定P值和做出推断结论 假设检验的两类错误 ...

  6. SpringMVC参数传递方案

    SpringMVC参数传递方案 登录 @PostMapping("/login") @ResponseBody public Map login(String username, ...

  7. 027 奥展项目涉及的javascipt知识点笔记

    1.获取指定div标签内的所有input标签 let inputs = document.getElementById("inspect-part1").getElementsBy ...

  8. Docker 部署ELK

    1.安装docker前安装pip sudo yum -y install epel-release sudo yum install python-pip 2.安装docker #安装依赖包 yum ...

  9. log4j打印抛出异常时堆栈内容

    JAVA 中为快速定位,抛出异常的位置.往往需要在日志中描述. log.err("异常出错点", e); 会将出错时的堆栈信息显示出来. package com.jqyc.jase ...

  10. grafana的用户及权限的配置

    一.概述 在上几篇文章中,已经在grafana中,配置了几个Dashboard.需要给开发人员查看,但是我又不想让开发人员,随便更改Dashboard中的配置.需要创建一个只读账号才行. 二.添加用户 ...