本章主要讲的是Timer定时器的使用。
执行时间晚于当前时间:在未来时间执行。
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)
如果计划时间早于当前时间,那么立即执行task任务。
多个TimerTask任务及延时的测试
TimerTask是以队列的方式一个一个被顺序执行的,所以执行的时间有可能和预期的时间不一致。
在指定的日期之后,按指定的间隔周期性地无限循环地执行某一任务
TimerTask的cancel方法,当前任务被取消,其他任务不受影响
Timer的cancel方法,将任务队列中的全部任务清空
Timer的cancel方法注意事项
Timer的cancel方法有时并不一定会停止计划任务,而是正常执行,这是因为Timer类中的cancel方法有时并没有争抢到queue锁。
方法schedule和方法scheduleAtFixedRate都会按顺序执行,所以不要考虑非线程安全的情况。
schedule方法不具有追赶执行性
当任务首次运行时间早于当前时间,那么这段时间内的任务不会执行,而是从当前时间开始。
scheduleAtFixedRate方法具有追赶执行性
比如我们当前时间为“2014-10-12 15:50:00”,任务首次运行时间为“2014-10-12 15:45:50”,那么它会将这段时间内的任务弥补运行。