JAVA并发编程(三)Timer类 - Go语言中文社区

JAVA并发编程(三)Timer类


定时计划任务在Java里主要是Timer类,他的内部使用了多线程的处理方式。Timer类的主要作用是设置计划任务,但封装任务的类却是TimerTask类。
在这里插入图片描述
TimerTask就是一个线程。创建一个Timer就是启动了一个新的线程,这个新启动的线程如果不设置为守护线程的话会一直运行,所以private static Timer timer = new Timer(true);
如果执行任务的时间早于当前时间,则立即执行task 任务。
如果有多个TimerTask的话,TimerTask是以队列的方式一个一个的被顺序执行的,所以执行的时间有可能和预期时间不一致,因为前面的任务有可能消耗的时间较长,则后面的任务运行的时间也会被延迟。

方法schedule(TimerTask task, Date firstTime, long period)
该方法的作用是在指定的日期之后,按指定的间隔周期性的无限循环地执行某一个任务。如果计划时间早于当前时间,则立即执行task任务。任务被延时后还是能一个一个的顺序执行。

TimerTask类中的cancel()方法的作用是将自身从任务队列中清除。Timer类中的cancel()方法的作用是将任务队列中的全部任务清除。Timer类中的cancel()方法有时并不一定会停止执行计划任务,而是正常执行。原因是Timer类中的cancel()方法有时并没有争抢到queue锁,所以TimerTask类中的 任务继续正常执行。

方法schedule(TimerTask task, long delay)是以执行schedule方法当前的时间为参考时间,在此时间基础上延迟指定毫秒数后执行一次TimerTask任务。
方法schedule(TimerTask task, long delay, long period)的作用是以执行此方法的当前时间为参考时间,在此时间基础上延迟指定毫秒数,再以某一个时间间隔无限次的执行某一个任务。

方法schedule和方法scheduleAtFixedRate都会按顺序执行,所以不要考虑非线程安全的情况。在不延时的情况下,
schedule方法,下一次任务的执行时间参考的是上一次任务的开始时间。
scheduleAtFixedRate方法,下一次任务的执行时间参考的是上一次任务的结束的时间来计算。

如果被延时了,schedule和scheduleAtFixedRate在延时的情况下都会以结束时间作为参考。

schedlue函数如果设置的运行时间早于当前时间,比如”2014-10-12 15:37:00“ (函数设置时间)到 ”2014-10-12 15:43:53“(当前时间),这个时间段内的任务不会执行,这就是schedule的task任务不追赶的情况。scheduleAtFixedRate则具有追赶性,这个时间段的函数会被”补充性“的执行。

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/bianhao92115/article/details/84314384
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-02-25 01:17:43
  • 阅读 ( 873 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢