(4)schedule(task,delay,period)
在delay时间之后,开始首次执行task,之后每隔period毫秒重复执行一次task ,这个delay和上面的一样。
我们不如来看看源码:
这四个方法都执行了同一个方法sched,所以我们要弄清楚原理,就必须要再跟进去看看:
上面的代码我们来分析一下,最上面的if就是排除一下异常情况,最核心的就是synchronized里面的代码。首先将任务添加到队列中,然后根据nextExecutionTime调整队列。
添加任务add(task):
维护最小堆:
上面就是Timer中如何执行的定时任务核心,但是还有一个方法,也是执行定时任务的。叫scheduleAtFixedRate
下面我们来分析一下,然后比较和上面的不同。
4、scheduleAtFixedRate方法
这个方法有两个:
(1)scheduleAtFixedRate(task, time, period)
在时间等于或超过time的时候首次执行task,之后每隔period毫秒重复执行一次task 。这个time表示的是例如2019年11月11日上午11点11分11秒。指的是时刻。
(2)scheduleAtFixedRate(task, delay, period)
在delay时间之后,开始首次执行task,之后每隔period毫秒重复执行一次task ,这个delay表示的是延迟时间,比如说三秒后执行。
既然上面都已经有了4个定时器,为什么这里还要再增加几个呢?我们来分析一下他们的区别:
分两种情况: ① 首次计划执行的时间 schedule:如果第一次执行时间被delay了,随后的执行时间按照上一次实际执行完的时间点进行计算 。scheduleAtFixedRate:如果第一次执行时间被delay了,随后的执行时间按上一次开始的时间进行计算,并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑同步。
②任务执行所需时间 schedule方法:下一次执行时间会不断延后,因此参照的是上一次执行完成的时间点。scheduleAtFixedRate方法:下一次执行时间不会延后,因此存在并发性。我们可以看一下图:
5、其他方法
我们已经明白了如何创建Timer和执行定时任务,如果在执行的时候我们突然改变主意,想要取消怎么办呢?这里Timer当然为我们提供了。
(1)cancel:取消此计时器任务。
(2)scheduledExecutionTime():返回此任务最近实际执行的安排执行时间。
6、任务调度
任务调度也就是说我们的线程如何去执行这些任务。其实在TimerThread调用了run来执行,我们看一下源码。
也就是说其实真正执行任务调度的是mainLoop(),synchronized代码块只是为了确保在执行完之后能够移除这个task。
而这个mainLoop方法的思想很简单,就是拿出任务队列中的第一个任务,如果执行时间还没有到,则继续等待,否则立即执行。源码在这里就不再给出了。
三、Timer缺陷
本文地址:网络百科频道 https://www.eeeoo.cn/wangluo/903047_2.html,嗨游网一个专业手游免费下载攻略知识分享平台,本站部分内容来自网络分享,不对内容负责,如有涉及到您的权益,请联系我们删除,谢谢!