//在时刻 time 处执行任务
schedule(timertask task, date time)
//延时 delay 毫秒后执行任务
schedule(timertask task, long delay)
//固定延时重复执行,firsttime为首次执行时间,
//往后没间隔 period 毫秒执行一次
schedule(timertask task, date firsttime, long period)
//固定延时重复执行
//首次执行时间为当前时间延时 delay 毫秒
schedule(timertask task, long delay, long period)
//固定频率重复执行,每过 period 毫秒执行一次
scheduleatfixedrate(timertask task, date firsttime, long period)
//固定频率重复执行
scheduleatfixedrate(timertask task, long delay, long period)
相信有了注释,这几个方法的区别与作用应该不难理解,但是其中有两个概念需要作一点区分。 ==固定延时== vs ==固定频率==
固定延时:以任务的上一次 实际 执行时间做参考,往后延时 period 毫秒。
固定频率:任务的往后每一次执行时间都在任务提交的那一刻得到了确定,不论你上次任务是否意外延时了,定时定点执行下一次任务。
这两者的区别还是很大的,希望你能够理解清楚,接着我们以其中一个方法为例,看看底层实现。
以这个方法为例,其他重载方法的底层调用都是同样的,我们不去赘述。
这个方法的作用,我们再说一遍。
以当前时间为准,延时 delay 毫秒后第一次执行该任务,并且采取固定延时的方式,每隔 period 毫秒再次执行该任务。
开头的两个异常判断我们不再赘述,看看 sched 方法:
方法需要传入三个参数,参数 task 代表的需要执行的任务体,timertask 我们回头会详细介绍,这里你知道它代表了一个任务体即可。
参数 time 描述了该任务下一次执行的时刻,计算机底层是以毫秒描述时刻的,所以这里转换为 long 类型来描述时刻。
参数 period 是固定延时的毫秒数。
整个方法的逻辑我们可以总结概括一下,具体的代码就不一行行分析了,因为也不难。
首先使用任务队列的内置对象锁,锁住个队列。
接着再去锁住我们的 task,并修改其内部的一些属性字段值,nextexecutiontime 指明下一次任务执行时间,period 设置固定延时的毫秒数,修改 state 状态为计划中。