社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
定时计划任务在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则具有追赶性,这个时间段的函数会被”补充性“的执行。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!