package java.util;

//抽象类:一种任务,可由定时器安排一次或重复执行,实现了Runnable接口
public abstract class TimerTask implements Runnable {
    //    此对象用于控制对TimerTask内部的访问。
    final Object lock = new Object();
    //任务状态
    int state = VIRGIN;
    //尚无计划执行此任务
    static final int VIRGIN = 0;

    //计划执行此任务。如果是不重复的任务,
    // 它还没有被执行。
    static final int SCHEDULED = 1;

    //非重复任务正在被执行,但没有被取消
    static final int EXECUTED = 2;
    //此任务被取消
    static final int CANCELLED = 3;

    //此任务的下一次执行时间,单位为毫秒
    //假设此任务已计划执行。
    //对于重复任务,此字段在每次任务执行之前更新。
    long nextExecutionTime;

    //    重复任务的周期(毫秒)。正值表示固定速率执行。负值表示固定延迟执行,值0表示不重复的任务。
    long period = 0;

    //创建一个TimerTask
    protected TimerTask(){
    }

    //执行
    public abstract void run();

    //取消此任务
    public boolean cancel(){
        synchronized (lock) {
            boolean result = (state == SCHEDULED);
            state = CANCELLED;
            return result;
        }
    }

    //    返回最近一个实际执行此任务。(如果调用时,任务正在执行时,返回值是正在执行的任务的执行时间。
    public long scheduledExecutionTime(){
        synchronized (lock) {
            return (period < 0 ? nextExecutionTime + period
                    : nextExecutionTime - period);
        }
    }
}