1. 定时器框架
类Timer和TimerTask组成了Timer框架。
Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。
import java.util.Timer;
import java.util.TimerTask;
//定时器框架。定时器任务单次执行或规律性的重复执行
//每隔1000毫秒输出当前时间
public class TimerDemo {
public static void main(String[] args)
{
TimerTask task = new TimerTask()
{
@Override
public void run()
{
System.out.println(System.currentTimeMillis());
}
};
Timer timer = new Timer();
timer.schedule(task,0, 1000);
}
}
2.Timer类
Timer适用于大规模并发调度定时任务。在内部,该类使用了一个二进制的堆表示其定时任务队列,使得调度定时任务的开销为O(log n),这里的n就是并发调度定时任务的数量。
常用函数:
(1)Timer():创建一个新的定时器,其任务执行线程是非守护线程。
(2)Timer(boolean isDaemon):创建一个新的定时器,其任务执行线程可能会以守护线程(传递true给isDaemon变量)的方式运行。
(3)Timer(String name):创建一个新的定时器,其任务执行线程拥有指定的名称且不会以守护线程的方式执行。
(4)Timer(String name, boolean isDaemon):创建一个新的定时器,其任务执行线程拥有指定的名称且可能会以守护线程的方式执行。
(5)void cancel():终止该定时器,丢弃所有当前调度的定时器任务。
(6)int purge(): 从该定时器队列中移除所有取消的定时任务并且返回被移除任务的数目。
(7)void schedule(TimerTask task, Date time): 在某个时间点调度任务执行。
(8)void schedule(TimerTask task, Date firstTime,long period): 调度任务于firstTime开始,以固定时间间隔的方式重复执行,后续以大约period毫秒数的固定时间间隔执行。在固定延迟执行中,每次执行都是相对于上次执行的实际发生时间的。当某次执行因为一些原因被延迟(比如垃圾回收),后续的执行也都会被延迟。
(9)void schedule(TimerTask task, long delay):在delay毫秒数之后调度任务执行。
(10)void schedule(TimerTask task,long delay,long period): 在delay毫秒数之后,以固定时间间隔的方式重复执行,后续以大约period毫秒数的固定时间间隔执行。
(11)void scheduleAtFixedRate(TimerTask task, Date firstTime, long period): 调度任务于firstTime开始,以固定速率的方式重复执行,后续以大约period毫秒数的固定时间间隔执行。
(12)void scheduleAtFixedRate(TimerTask task, long delay, long period): 在delay毫秒数之后,开始调度任务以固定速率的方式重复执行,后续以大约period毫秒数的固定时间间隔执行。
3. TimeTask类
boolean cancel(): 取消这个定时任务。
long scheduledExecutionTime(): 返回此定时任务最近实际被调度执行的时间。
4. Timer的cancel()的方法和TimerTask的cancel()方法的区别?
TimerTask类中的cancel()方法侧重的是将自身从任务队列中清除,其他任务不受影响,而Timer类中的cancel()方法则是将任务队列中全部的任务清空。
TimerTask类中的cancel()方法测试:
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Test {
public static void main(String[] args) throws InterruptedException {
System.out.println("当前时间为:" + new Date());
Calendar c = Calendar.getInstance();
Date runDate1 = c.getTime();
System.out.println("计划时间为:" + runDate1);
MyTaskA task1 = new MyTaskA();
MyTaskB task2 = new MyTaskB();
Timer timer = new Timer();
timer.schedule(task1, runDate1, 4000);
timer.schedule(task2, runDate1, 4000);
}
}
class MyTaskA extends TimerTask {
@Override
public void run() {
System.out.println("A run timer=" + new Date());
this.cancel();// 调用的是TimerTask类中的cancel()方法
System.out.println("A任务自己移除自己,B任务不受影响,继续运行");
}
}
class MyTaskB extends TimerTask {
@Override
public void run() {
System.out.println("B run timer=" + new Date());
}
}
运行结果:
当前时间为:Tue Nov 20 21:25:30 CST 2018
计划时间为:Tue Nov 20 21:25:30 CST 2018
A run timer=Tue Nov 20 21:25:30 CST 2018
A任务自己移除自己,B任务不受影响,继续运行
B run timer=Tue Nov 20 21:25:30 CST 2018
B run timer=Tue Nov 20 21:25:34 CST 2018
Timer类中的cancel()方法测试:
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
public class Test {
public static void main(String[] args) throws InterruptedException {
System.out.println("当前时间为:" + new Date());
Calendar c = Calendar.getInstance();
Date runDate1 = c.getTime();
System.out.println("计划时间为:" + runDate1);
MyTaskA task1 = new MyTaskA();
MyTaskB task2 = new MyTaskB();
Timer timer = new Timer();
timer.schedule(task1, runDate1, 4000);
timer.schedule(task2, runDate1, 4000);
Thread.sleep(12000);
timer.cancel();
System.out.println("A、B任务都移除了");
}
}
class MyTaskA extends TimerTask {
@Override
public void run() {
System.out.println("A run timer=" + new Date());
}
}
class MyTaskB extends TimerTask {
@Override
public void run() {
System.out.println("B run timer=" + new Date());
}
}
运行结果:
当前时间为:Tue Nov 20 21:29:03 CST 2018
计划时间为:Tue Nov 20 21:29:03 CST 2018
A run timer=Tue Nov 20 21:29:03 CST 2018
B run timer=Tue Nov 20 21:29:03 CST 2018
B run timer=Tue Nov 20 21:29:07 CST 2018
A run timer=Tue Nov 20 21:29:07 CST 2018
A run timer=Tue Nov 20 21:29:11 CST 2018
B run timer=Tue Nov 20 21:29:11 CST 2018
A、B任务都移除了