Timer+TimerTask可以实现定时任务
Timer定时器原理:源码是使用Object.wait(timeout)进行线程阻塞,timeout是根据下次执行时间和当前时间之差来计算。
简单来说,就是归结为一个多线程协作(互斥下的协作)
在java.util.concurrent中的ScheduledThreadPoolExecutor,也可以完全实现定时任务的功能。
而其他的框架,无非是功能的增强,特性更多,更好用,都是在基础的java之上的包装。
示例代码如下:
Timer timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { System.out.println("hello world"); } }, 1000, 5000);
Timer通过schedule方法执行定时任务
//delay 为多少秒后执行第一次 //period 为执行第一次后,多少秒执行一次 public void schedule(TimerTask task, long delay, long period) //firstTime 为指定时间执行第一次 public void schedule(TimerTask task, Date firstTime, long period) //指定时间执行一次,仅一次 public void schedule(TimerTask task, Date time) //指定多少秒后执行一次,仅一次 public void schedule(TimerTask task, long delay)
同时,Timer还提供了scheduleAtFixedRate方法,参数及调用方式跟schedule一致。
schedule跟scheduleAtFixedRate的区别在于:
schedule:根据上一次任务结束的时间来算间隔时间,所以不存在并发问题,但是任务可能会被推迟。
scheduleAtFixedRate:严格按照间隔时间执行,所以可能存在并发问题。