Timer类
程序员文章站
2022-05-07 23:14:16
...
一、Timer类
1.1 概述
Timer类的作用是设置计划任务,但是任务封装的类是TimerTask类。执行计划任务的代码要放入TimerTask的子类中,因此TimerTask是一个抽象类。
1.2 schedule(TimerTask task, Date time)方法
在指定的日期执行某一次任务
mytask类:
public class mytask extends TimerTask {
@Override
public void run() {
System.out.println("任务执行了");
}
}
测试类:
public class xtask {
public static void main(String[] args) throws ParseException {
Timer timer = new Timer();
mytask my = new mytask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String data = "2019-5-20 17:57:00";
Date parse = sdf.parse(data);
timer.schedule(my, parse);
}
}
Timer实例化对象传入任务参数和时间参数,就可以在特定的时间执行任务。任务执行完后,进程还未销毁,原因是线程不是守护线程。
使用新的Timer()构造方法,调用下面的方法
Timer timer = new Timer(true);
public Timer(boolean isDaemon) {
this("Timer-" + serialNumber(), isDaemon);
}
public Timer(String name, boolean isDaemon) {
thread.setName(name);
thread.setDaemon(isDaemon);
thread.start();
}
- public final void setDaemon(boolean on)
将该线程标记为守护线程或用户线程。当正在运行的线程都是守护线程时,Java 虚拟机退出。
该方法必须在启动线程前调用。
1.3 计划时间已过
如果计划时间已过,则会立刻执行task任务。
1.4 多个TimerTask任务
一个timer对象可以执行多个任务,而任务是以队列的形式一个个顺序执行的所以执行的时间有可能和预期的时间不太一样。
1.5 schedule(TimerTask task, Date firstTime, long period)
该方法的作用是在制定的日期之后,按制定的间隔周期性的无限的循环某一任务。
public class xtask {
public static void main(String[] args) throws ParseException {
Timer timer = new Timer();
mytask my = new mytask();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String data = "2019-5-20 17:57:00";
Date parse = sdf.parse(data);
timer.schedule(my, parse, 1000);
}
}
结果:
任务执行了
任务执行了
任务执行了
任务执行了
任务执行了
......
时间已过,则立即执行,否则按照指定的时间执行。
1.6 cancle()方法
- Timer类的cancle()方法
将自身从任务队类中剔除,其他任务不受影响。
public class mytask extends TimerTask {
@Override
public void run() {
System.out.println("任务执行了");
System.out.println("要剔除自己了" + " " + new Date().toLocaleString());
cancel();
}
}
测试类:
public class xtask {
public static void main(String[] args) throws ParseException {
Timer timer = new Timer();
mytask my = new mytask();
myTask1 my1 = new myTask1();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String data = "2019-5-20 17:57:00";
Date parse = sdf.parse(data);
timer.schedule(my, parse, 1000);
timer.schedule(my1, parse, 1000);
}
}
任务执行了
要剔除自己了 2019-5-20 20:12:14
执行了第二个任务
执行了第二个任务
执行了第二个任务
执行了第二个任务
......
- Timer类的cancle()方法
将任务队列中的任务全部清除,并且进程也被销毁。有时候Timer的cancle方法并不会停止任务的进行,而是任务正常执行,原因是cancle()方法并没有抢到queue锁。
1.7 其他方法
- schedule(TimerTask task, long delay)
在当前时间的基础上经过延迟时间执行任务。 - schedule(TimerTask task, long delay, long period)
在当前时间的基础上,经过延迟执行任务,再以period为周期循环执行任务。
1.8 方法scheduleAtFiexedRate(TimerTask task, Date firstTime ,long period)和schedule()区别
- 主要区别在于任务不延时的情况:
- schedule()方法:如果执行任务的时间没有被延时,那么下一次任务执行的时间根据上一次任务开始的时间计算,而scheduleAtFiexedRate()方法下次执行任务的时间参考的是上一次任务执行完结束的时间。如果任务延时的话,两个方法下一次任务执行参考的是上一次任务执行结束的时间。
- 追赶执行性
schedule()方法执行的任务超时,则会在当前时间的基础上执行任务,而scheduleAtFiexedRate()方法则会将已经超时未执行的任务补充执行。
public class xtask {
public static void main(String[] args) throws ParseException {
Timer timer = new Timer();
mytask my = new mytask(timer);
myTask1 my1 = new myTask1();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String data = "2019-5-20 20:59:00";
Date parse = sdf.parse(data);
timer.scheduleAtFixedRate(my, parse, 1000);
//timer.schedule(my1, parse, 1000);
}
}
scheduleAtFiexedRate()方法执行的结果:
任务执行了
要剔除自己了 2019-5-20 21:01:54
任务执行了
要剔除自己了 2019-5-20 21:01:54
任务执行了
要剔除自己了 2019-5-20 21:01:54
任务执行了
要剔除自己了 2019-5-20 21:01:54
任务执行了
要剔除自己了 2019-5-20 21:01:54
任务执行了
要剔除自己了 2019-5-20 21:01:54
.....
scedule()方法执行的结果:
任务执行了
要剔除自己了 2019-5-20 21:03:57
任务执行了
要剔除自己了 2019-5-20 21:03:58
任务执行了
要剔除自己了 2019-5-20 21:03:59
......
上一篇: 数据结构思维笔记(十六)爬取百度百科
下一篇: Timer和TimerTask定时器使用