Timer定时器
- Timer介绍
- Timer的使用方法
- schedule()和scheduleAtFixedRate()区别
- Timer实现Demo
- 定时器取消
Timer介绍
直接用java自带的定时器比较方便,对于一些简单的项目可以使用,不需要多余的jar包引用,但同时,它没有丰富的执行表达式,扩展性较低。对于一些简单的项目是个很好的选择。
java.util.Timer
Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
java.util.TimerTask
TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。
Timer的使用方法
Timer(); 创建一个新的计时器。
Timer(boolean isDaemon); 创建一个新的定时器,其相关线程可以指定为 run as a daemon 。
Timer(String name); 创建一个新的定时器,其相关线程具有指定的名称。
Timer(String name, boolean isDaemon); 创建一个新的定时器,其相关线程具有指定的名称,可以指定为 run as a daemon 。
isDaemon为true则作为守护进程,如果所属进程结束则不论守护进程有没有结束都直接退出。当JVM停止时,任何剩余的守护程序线程都被放弃:最后块不会被执行,堆栈也不会被解除 - JVM就会退出,使用要慎重。
定时器Timer的schedule方法,用来定义定时任务的执行规则方法如下,其中TimerTask是必须的参数,可以是一个类继承了TimerTask,然后重写run方法,或者直接用匿名内部类new TimerTask。任务不会重复执行,一次任务执行完毕,下一次任务才会开始。
Timer timer = new Timer();
timer.schedule(TimerTask task,Date time);//在特定时间执行任务,只执行一次
timer.schedule(TimerTask task,long delay);//在特定延迟(ms)之后执行任务,只执行一次
timer.schedule(TimerTask task,Date firstTime,long period);//指定第一次执行的时间,然后按照间隔时间,重复执行
timer.schedule(TimerTask task,long delay,long period);//在特定延迟之后第一次执行,然后按照间隔时间,重复执行
timer.scheduleAtFixedRate(TimerTask task,Date firstTime,long period);//指定第一次执行的时间,然后按照间隔时间,重复执行
timer.scheduleAtFixedRate(TimerTask task,long delay,long period);//在特定延迟之后第一次执行,然后按照间隔时间,重复执行
schedule()和scheduleAtFixedRate()区别
schedule(TimerTask task,Date firstTime,long period):schedule方法的延迟是从task任务结束的时间算,加上period延迟之后开始执行下一次任务。如果firstTime小于当前时间,则方法会直接开始执行一次,并且按照period的延迟规则执行后面的每一次任务。
scheduleAtFixedRate(TimerTask task,Date firstTime,long period):scheduleAtFixedRate是按照task开始的时间算,加上period延迟执行下一次任务,如果一次任务执行时间较长,下一次任务的时间已经到了,则下一次任务会排队等待,一旦上一次任务完成,则下一次任务马上开始。如果firstTime小于当前时间,则方法会立即执行多次来把当前时间之前没有执行的次数补全,之后才会按照period的延迟来执行。
Timer实现Demo
public class Test{
Timer timer = new Timer();
timer.schedule(new Task(), 0, 30*60*1000);
}
public class Task extends TimerTask {
@Override
public void run() {
System.out.println("定时任务执行");
}
}
或者
public class Test{
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("定时任务执行");
}
},1000,1000);
}
定时器取消
//取消定时任务
timer.cancle();