1. Timer类
Timer
类主要用于设置计划任务,TimerTask
用于实现任务。
public class ThreadTimer {
public static void main(String[] args) {
Timer timer = new Timer();
TimerTask task = new TimerTask() {
@Override
public void run() {
System.out.println("TimerTask");
}
};
timer.schedule(task, 0);
}
}
任务虽然执行完了,但进程还未销毁,原因就在于Timer
启动了一个线程。
public Timer(String name, boolean isDaemon) {
thread.setName(name);
thread.setDaemon(isDaemon);
thread.start();
}
设置Timer(boolean isDaemon)
为守护进程,当主进程结束时,自动结束。
Timer timer = new Timer(true);
调用TimerTask.cancel()
和Timer.cancel()
方法来取消任务。调用TimerTask.cancel()
方法会停止任务的执行,但不会影响整个Timer
的执行。
2. 主要方法
Timer
的主要方法
schedule(TimerTask task, Date time)
,在指定日期执行一次任务。schedule(TimerTask task, Date firstTime, long period)
,在指定日期之后按指定的间隔周期,无限循环地执行某一任务。schedule(TimerTask task, long delay)
,以当前时间为参考时间,在此时间基础上延迟指定的毫秒数执行一次任务。schedule(TimerTask task, long delay, long period)
,以当前时间为参考时间,在此时间基础上延迟指定的毫秒数之后,按指定的间隔周期,无限循环地执行某一任务。scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
,在指定日期之后按指定的间隔周期,无限循环地执行某一任务。scheduleAtFixedRate(TimerTask task, long delay, long period)
,以当前时间为参考时间,在此时间基础上延迟指定的毫秒数之后,按指定的间隔周期,无限循环地执行某一任务。cancel()
,取消所有任务。
TimerTask
的主要方法
run()
,运行本次任务cancel()
,取消本次任务
schedule()
和scheduleAtFixedRate()
的区别
schedule()
会保证任务的间隔是按照定义的period
参数严格执行的,如果某一次调度时间比较长,那么后面的时间会顺延,保证调度间隔都是period
。scheduleAtFixedRate()
是严格按照调度时间来的,如果某次调度时间太长了,那么会通过缩短间隔的方式保证下一次调度在预定时间执行。
例如执行一个3秒的循环任务,第一次任务执行了4秒,第二次执行了1秒。schedule()
的执行时间为0, 4, 7, 10, 13, …,而scheduleAtFixedRate()
的执行时间为0, 4, 6, 9, 12, …。