java多线程编程核心技术——第五章总结
定时器Timer的使用
- 1.1方法schedule(TimerTask task, Date time)的测试
- 1.2方法schedule(TimerTask task, Date firstTime, long period)的测试
- 1.3方法schedule(TimerTask task, long delay)的测试
- 1.4方法schedule(TimerTask task, long delay, long period)的测试
- 1.5方法scheduleAtFixedRate(TimerTask task, Date firstTime, long period)的测试
在JDK中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务。
Timer类的主要作用是设置计划任务,但封装任务的类却是TimerTask类。
执行计划任务的代码要放入TimerTask的子类中,因为TimerTask是一个抽象类。
注:在做Demo期间阿里的IDEA插件爆出建议:
多线程并发处理定时任务时,Timer运行多个TimerTask时,只要其中之一没有捕获抛出的异常,其它任务就会终止,使用ScheduledExecutorService则没有这个问题。
方法schedule(TimerTask task, Date time)的测试
1.执行任务的时间晚于当前时间:在未来执行的效果。
Timer timer = new Timer();
这个构造是获取Timer对象的方式直接,这个构造方法创建的是非守护线程。
TimerTask类似于线程(但并不是),他所执行的的定时任务是重写在run()方法中的(自定义任务类继承TimerTask然后重写了run())。
class MyTask extends TimerTask {
public void run(){}
}
MyTask task = new MyTask();
//通过下面方法实现执行定时任务,date为要执行run()的时间。
timer.schedule(task,date)
只要将date设置为未来的时间,且重写run()方法,就可以在制定时间执行想要做的定时任务了。
这个Timer的构造是创建的是一个守护线程。
Timer timer = new Timer(true);
源码如下:
这个空参构造最终会调用下面的构造
可以看出空参构造的作用:创建一个Timer就是启动一个新的线程,而且这个新线程并不是守护线程一直运行。
使用另一种构造,则可以获取守护线程:
2.计划时间早于当前时间,提前运行的效果
注:如果执行任务的时间早于当前时间,那么立即执行task任务。
3.多个TimerTask任务及延时的测试
多个TimerTask可以被一个Timer执行。调用的方法是:schedule(TimerTask task, Date time)。
TimerTask是以队列的方式一个一个被顺序执行的,所以可能出现执行的时间与预期的时间不一致的情况,因为前面的任务有可能消耗较长的时间,则后面的任务会被延迟。
方法schedule(TimerTask task, Date firstTime, long period)的测试
该方法是在指定的日期后(firstTime)按指定的间隔(period)周期性地无限地执行某一任务。
1.计划时间晚于当前时间:在未来执行的结果
一旦当前时间(本地计算机时间)到达指定时间(firstTime),TimerTask中的任务会被立即执行,随后每间隔一段时间(period)执行一次。
2.计划时间早于当前时间:提前运行的效果
在当前时间立即执行TimerTask中的任务,且每个一段时间(period)执行一次。
注:起点以当前线程启动的时间为准,即调用schedule()方法为准,间隔也是以这个时间为起点。
3.任务执行时间被延时
如果程序执行的消耗时间大于间隔时间(period),那么任务的执行就会延后,谁大以谁为准。
注:消耗时间大,就以消耗时间为准;间隔时间大,就以间隔时间为准。
4.TimerTask类的cancel()方法
TimerTask类的cancle()方法是将自身从任务队列中移除,其他任务依旧在任务队列不收影响。
5.Timer类的cancel()方法
Timer类的cancel()方法作用是将任务队列中的全部任务清空。
注:调用cancel()后,全部任务被清空,进程被销毁。
注:Timer类的cancel()的注意事项:Timer类中的cancel()方法有时并不一定会停止执行计划任务,而是正常执行。
这是因为Timer类中的cancel()方法有时并没有争抢到queue锁,所以TimerTask类中的任务继续正常执行。
(这个注意事项,我没有想太明白,以后会再看的)
方法schedule(TimerTask task, long delay)的测试
该方法的作用是以当前时间为参考时间(这个当前时间指的是调用schedule(TimerTask task,long delay)的时间),在此基础上延迟指定毫秒数后执行一次TimerTask任务。
方法schedule(TimerTask task, long delay, long period)的测试
该方法的作用是以当前时间为参考时间(这个当前时间指的是调用schedule(TimerTask task,long delay)的时间),在此基础上延迟指定毫秒数,再以某一间隔时间无限次地执行某一任务。
方法scheduleAtFixedRate(TimerTask task, Date firstTime, long period)的测试
方法schedule与方法scheduleAtFixedRate都会按顺序执行,所以不需要考虑非线程安全的情况。
方法schedule与方法scheduleAtFixedRate的主要区别在于不延时的情况。
使用schedule方法,如果执行任务没有被延时,那么下一次任务的执行时间参考的是上一次任务的“开始”时的时间计算的。
使用scheduleAtFixedRate方法,如果执行任务没有被延时,那么下一次任务的执行时间参考的是上一次任务的“结束”的时间计算的。
延时的情况则没有区别,也就是说如果两者都被延时,那么都已上一次任务结束的时间计算。
注:schedule不具有追赶性。
scheduleAtFixedRate具有追赶性。
追赶性:起始时间早于当前时间,会将两段时间内的任务进行追赶式(弥补错过的时间)的执行。
这只是定时器简单的API实现。
实际上Spring通过了注解实现定时器,会找时间对其进行总结的。
注解式定时器——SpringTask的实现(未完成)
本文内容是书中内容兼具自己的个人看法所成。可能在个人看法上会有诸多问题(毕竟知识量有限,导致认知也有限),如果读者觉得有问题请大胆提出,我们可以相互交流、相互学习,欢迎你们的到来,心成意足,等待您的评价。
java多线程编程核心技术——第五章总结的更多相关文章
- Java多线程编程核心技术-第1章-Java多线程技能-读书笔记
第 1 章 Java 多线程技能 本章主要内容 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 1.1 进程和多线程的概念及线程的优点 进程是操作系统结构的基础:是一次程 ...
- Java多线程编程核心技术-第4章-Lock的使用-读书笔记
第 4 章 Lock 的使用 本章主要内容 ReentrantLocal 类的使用. ReentrantReadWriteLock 类的使用. 4.1 使用 ReentrantLock 类 在 Jav ...
- java多线程编程核心技术——第三章
第一节等待/通知机制 1.1不使用等待/通知机制实现线程间的通讯 1.2什么是等待/通知机制 1.3等待/通知机制的实现 1.4方法wait()锁释放与notify()锁不释放 1.5当interru ...
- java多线程编程核心技术——第三章总结
第一节等待/通知机制 1.1不使用等待/通知机制实现线程间的通讯 1.2什么是等待/通知机制 1.3等待/通知机制的实现 1.4方法wait()锁释放与notify()锁不释放 1.5当interru ...
- Java多线程编程核心技术-第7章-拾遗增补-读书笔记
第 7 章 拾遗增补 本章主要内容 线程组的使用. 如何切换线程状态. SimpleDataFormat 类与多线程的解决办法. 如何处理线程的异常. 7.1 线程的状态 线程对象在不同的运行时期有不 ...
- Java多线程编程核心技术-第5章-定时器 Timer-读书笔记
第 5 章 定时器 Timer 定时 / 计划功能在移动开发领域使用较多,比如 Android 技术.定时计划任务功能在 Java 中主要使用的就是 Timer 对象,他在内部使用多线程的方式进行处理 ...
- Java多线程编程核心技术-第2章-对象及变量的并发访问-读书笔记
第 2 章 对象及变量的并发访问 本章主要内容 synchronized 对象监视器为 Object 时的使用. synchronized 对象监视器为 Class 时的使用. 非线程安全是如何出现的 ...
- java多线程编程核心技术——第七章补漏拾遗
本章主要知识点: 1)线程组的使用 2)如何切换线程状态 3)SimpleDateFormat类与多线程的解决方法 4)如何处理线程异常. 这本书基本来到了终点,其实在第四章来说,核心(基础)的线程知 ...
- java多线程编程核心技术——第四章总结
第一节使用ReentrantLock类 1.1使用ReentrantLock实现同步:测试1 1.2使用ReentrantLock实现同步:测试2 1.3使用Condition实现等待/同步错误用法与 ...
随机推荐
- ORM框架SQLAlchemy与权限管理系统的数据库设计
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用对象关系映射进行数据库操作,即:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果. 执行流 ...
- MySQLbase
/*多行注释*/-- 单行注释-- 创建用户: CREATE USER '用户名'[@'主机名'] IDENTIFIED BY '密码'-- 主机名可以为空,省略主机名表示默认权限为%, 所有主机都可 ...
- MUI开发记录——我的考勤
已经好久没有更新技术博客了,因为最近一直在做跨平台web app应用的开发,由于是刚做这个,也没太多经验同大家分享,可我是一个闲不住的人,我还是决定于百忙之中抽空整理一篇,记录下开发历程......— ...
- C#的XML文件的读取与写入
在设计程序的时候,对于一些变化性较强的数据,可以保存在XML文件中,以方便用户修改.尤其是对于一些软硬件的配置文件,很多都选择了用XML文件来存取.XML文件简单易用,而且可以在任何应用程序中读写数据 ...
- Leetcode刷题
Leetcode题库 本博客用于记录在LeetCode网站上一些题的解答方法.具体实现方法纯属个人的一些解答,这些解答可能不是好的解答方法,记录在此,督促自己多学习多练习. The ...
- 使用duilib开发简单的Window安装包
一.具体思路 安装过程:安装包的制作包括资源文件的打包,资源文件打包到安装包exe中,安装的时候需要从exe中提取出对应的资源文件, 然后解压文件安装到指定目录,然后就是对安装的可执行程序进行注册表的 ...
- protobuf/android 交叉编译笔记
protobuf 交叉编译笔记 目标是使用 android ndk 的工具链编译出 android armeabi-v7a 可用的 protobuf 库. 交叉编译环境配置 windows 平台 下载 ...
- Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享
Redis+Tomcat+Nginx集群实现Session共享,Tomcat Session共享 ============================= 蕃薯耀 2017年11月27日 http: ...
- 开始python成长之路
因为某种特殊原因很不幸的得了脱髓鞘 正要去实习 大展身手 甚至公司都选好了 可就在这个节骨眼..得了传说中的脱髓鞘.经过一年的修养 我决定还是要站起来 毕竟一生的时间很长 这一段时间 我都在玩游戏赚钱 ...
- PHP+Redis 实例【一】点赞 + 热度 下篇
这篇主要讲如何将数据保存回Mysql,但是里面还会涉及到如何将错误信息以及提示信息保存到文件里,方便以后的运维,再有就是如何使用PHP写进程BAT. Redis数据刷回数据库前的知识准备 首先针对上篇 ...