一说到定时任务,脑海里浮现出来的肯定是quartz、spring等组件,其实JDK里面已经有做了相应的封装,一些简单的定时任务已经够用,下面以每天下午6点半执行一个任务为例来说明用法。
详细的操作方法或具体步骤
?//创建定时任务线程池,默认5个
ScheduledExecutorService executor=Executors.newScheduledThreadPool(5);
为什么没有用Timer timer=new Timer()呢?
因为Timer所有任务都是由同一个线程来调度,因此所有任务都是串行执行的,同一时间只能有一个任务在执行,前一个任务的延迟或异常都将会影响到之后的任务。如果说某个任务出现了异常,这个定时器上的所有任务都会终止。
鉴于 Timer 的上述缺陷,Java 5 推出了基于线程池设计的 ScheduledExecutor。其设计思想是,每一个被调度的任务都会由线程池中一个线程去执行,因此任务是并发执行的,相互之间不会受到干扰。需 要注意的是,只有当任务的执行时间到来时,ScheduedExecutor 才会真正启动一个线程,其余时间 ScheduledExecutor 都是在轮询任务的状态。
如下图所示,创建真正的任务调度。核心代码:
executor.scheduleAtFixedRate( )。
为什么用scheduleAtFixedRate呢?
scheduleAtFixedRate(TimerTask task, long delay,long period) 安排指定的任务在指定的延迟后开始进行重复的固定速率执行。schedule(TimerTask task,Date firstTime, long period)是用重复固定延迟触发的,每次执行之后每次执行时间为上一次任务结束起向后推一个时间间隔,即每次执行时间 为:initialDelay, initialDelay+executeTime+period,initialDelay+2*executeTime+2* period。
一句话就是schedule是每次执行后,然后再间隔period。而scheduleAtFixedRate是不算上执行时间的,这样就没有误差。



注意事项对于scheduleAtFixedRate方法,当我们要执行的任务时间不要大于我们指定的执行间隔。经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。作者声明:本教程系本人依照真实经历原创,未经许可,谢绝转载。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
