Java定时任务Timer+TimerTask

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一致。

schedulescheduleAtFixedRate的区别在于:

schedule:根据上一次任务结束的时间来算间隔时间,所以不存在并发问题,但是任务可能会被推迟。

scheduleAtFixedRate:严格按照间隔时间执行,所以可能存在并发问题。