Java时间类库Timer的使用方法与实例详解
使用Java来调度定时任务时,我们经常会使用Timer类搞定。Timer简单易用,在一些业务场景下用来实现简单定时调度。
Jave时间类库Timer简单使用
- 创建Timer对象
- 编写自己的task类,该类集成TimerTask,重写run方法,把要定时执行的逻辑写在里面
- 使用Timer执行TimerTask
//5秒后开始执行,每秒执行一次 Timertimer=newTimer(); timer.schedule(newTimerTask(){ publicvoidrun(){ System.out.println("helloworld"); } },50000,1000);
Timer里面的一些常用方法
经过delay(ms)后开始进行调度,仅仅调度一次。
publicvoidschedule(TimerTasktask,longdelay)
在指定的时间点time上调度一次
publicvoidschedule(TimerTasktask,Datetime)
在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调度
publicvoidschedule(TimerTasktask,longdelay,longperiod)
在到了指定时间后开始调度,每次调度完后,最少等待period(ms)后才开始调度。
publicvoidschedule(TimerTasktask,DatefirstTime,longperiod)
在delay(ms)后开始调度,然后每经过period(ms)再次调度。
publicvoidscheduleAtFixedRate(TimerTasktask,longdelay,longperiod)
schedule方法的区别在于:
schedule在计算下一次执行的时间的时候,是通过当前时间(在任务执行前得到)+时间片,而scheduleAtFixedRate方法是通过当前需要执行的时间(也就是计算出现在应该执行的时间)+时间片,前者是运行的实际时间,而后者是理论时间点。比如:
- schedule时间片是5s,那么理论上会在5、10、15、20这些时间片被调度,但是如果由于某些CPU征用导致未被调度,假如等到第8s才被第一次调度,那么schedule方法计算出来的下一次时间应该是第13s而不是第10s
- scheduleAtFixedRate方法就是每次理论计算出下一次需要调度的时间用以排序,若第8s被调度,那么计算出应该是第10s,所以它距离当前时间是2s
在到了指定时间后开始调度,每次调度完后,最少等待period(ms)后才开始调度。
publicvoidscheduleAtFixedRate(TimerTasktask,DatefirstTime,longperiod)
内部结构
Timer类里包含一个任务队列和一个异步轮询线程。任务队列里容纳了所有待执行的任务,所有的任务将会在这一个异步线程里执行,切记:
- 任务的执行代码不可以抛出异常,否则会导致Timer线程挂掉,所有的任务都没得执行了。
- **单个任务也不易执行时间太长,否则会影响任务调度在时间上的精准性。**比如你一个任务跑了太久,其它等着调度的任务就一直处于饥饿状态得不到调度。所有任务的执行都是这单一的TimerThread线程。
publicclassTimer{ privatefinalTaskQueuequeue=newTaskQueue(); privatefinalTimerThreadthread=newTimerThread(queue); }
Timer的任务队列TaskQueue是一个特殊的队列,它内部是一个数组。这个数组会按照待执行时间进行堆排序,堆顶元素总是待执行时间最小的任务。
更多关于Jave时间类库Timer的使用方法与实例请查看下面的相关链接
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。