读书笔记——《Java多线程编程核心技术》第五章

本章主要讲的是Timer定时器的使用。

schedule(TimerTask task,Date time):在指定的日期执行一次某任务。
  1. 执行时间晚于当前时间:在未来时间执行。

    public class Run {

    private static Timer timer = new Timer();
    static public class MyTask extends TimerTask {
    
        @Override
        public void run() {
            System.out.println("运行了!时间为:" + new Date());
        }
    
    }
    
    public static void main(String[] args) {
    
        MyTask task = new MyTask();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateString = "2014-10-12 11:55:00";
        try {
            Date dateRef = sdf.parse(dateString);
            System.out.println("字符串时间:" + dateRef.toLocaleString());
            timer.schedule(task, dateRef);
        } catch (java.text.ParseException e) {
            e.printStackTrace();
        }
    }
    

    }

运行后就会发现,任务虽然运行完了,但按钮还是呈红色。这是为什么呢?
点开Timer的构造函数,发现:

   public Timer(String name) {
    thread.setName(name);
    thread.start();
}

启动了一个线程,但是该线程并不是守护线程,所以会在后台一直存在。
那如何将其改为守护线程呢?

Timer timer = new Timer(true)
  1. 如果计划时间早于当前时间,那么立即执行task任务。

  2. 多个TimerTask任务及延时的测试

TimerTask是以队列的方式一个一个被顺序执行的,所以执行的时间有可能和预期的时间不一致。

schedule(TimerTask task,Date firstTime,long period)

在指定的日期之后,按指定的间隔周期性地无限循环地执行某一任务

  1. 计划时间晚于当前时间:在指定的时间后按照时间间隔无限循环
  2. 计划时间早于当前时间:提前运行并按照时间间隔无限循环
  3. 任务执行时间被延时:一个任务运行结束后,另一个任务开始无限循环
    什么意思呢?就是比如我设置的时间间隔是4秒,但是我每一个任务需要6秒完成,那么第一个任务完成后继续进行下一个任务,并不会因此而停止。

TimerTask的cancel方法,当前任务被取消,其他任务不受影响
Timer的cancel方法,将任务队列中的全部任务清空

Timer的cancel方法注意事项

Timer的cancel方法有时并不一定会停止计划任务,而是正常执行,这是因为Timer类中的cancel方法有时并没有争抢到queue锁。

scheduleAtFixedRate(TimerTask task,Date firstTime,long period)

方法schedule和方法scheduleAtFixedRate都会按顺序执行,所以不要考虑非线程安全的情况。

schedule方法不具有追赶执行性

当任务首次运行时间早于当前时间,那么这段时间内的任务不会执行,而是从当前时间开始。

scheduleAtFixedRate方法具有追赶执行性

比如我们当前时间为“2014-10-12 15:50:00”,任务首次运行时间为“2014-10-12 15:45:50”,那么它会将这段时间内的任务弥补运行。