1.为什么要使用定时器呢?
(1)一个web应用,如果这个应用规模很大,那它的日志数据就很多,一直存下来服务器的存储量怕是不行,需要隔一段时间删除,
就需要一个线程每隔一段时间去删除日志数据
(2)在应用开发中,经常需要一些周期性的操作,比如每5分钟执行某一操作(例如:每隔一段时间删除日志数据)
(3)对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类
2.使用定时器一些注意点
(1)每一个Timer仅对应唯一一个线程
(2)Timer不保证任务执行的十分精确
(3)Timer类的线程安全的
3.Timer和TimerTask
(1)Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,
可以指定执行一次或者反复执行多次
(2)TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务
(3)具体的TimerTask需要由自己来实现
(4)Timer的实现机制就是内部的调度机制
4.Timer里面的一些常见方法
(1)调用方法:schedule(),scheduleAtFixedRate()
<1>根据传入的参数不同,执行时间不同,可以自定义设置
<2>具体可以参考java.util.Timer工具类
(2)方法名称schedule()和scheduleAtFixedRate()两者的区别
<1>schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
<2>scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,
下一次就会尽量小于period,以保障频率接近于period
(3)cancel():Timer和TimerTask都有该方法
<1>Timer.cancel():终止此计时器,丢弃任何当前计划的任务
<2>TimerTask.cancel():终止该TimerTask,取消该计时器任务
(4)purge() :从该计时器的任务队列中删除所有取消的任务
5.代码示例:
package .base;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Timer;
import java.util.TimerTask;
/**
* @author 作者名称
* @date 2019年8月28日 上午11:22:40
* @TODO 描述
*/
public class TimerUtil {
public static void main(String[] args) throws Exception {
System.out.println(new Date().getTime()+"-------开始定时任务--------");
timer1();
timer2();
timer3();
}
/**
* 第一种方法:设定多长时间(毫秒)后执行任务(两个参数)
* 只执行一次
*/
public static void timer1() {
Timer timer = new Timer();
/* void java.util.Timer.schedule(TimerTask task, long delay) */
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------任务执行--------");
}
}, 2000);// delay=2000毫秒 后执行该任务
}
/**
* 第二种方法:设定某个时间执行任务(两个参数)
* 只执行一次
*/
public static void timer2() {
//使用公历类GregorianCalendar
Calendar calendar = new GregorianCalendar();
calendar.add(Calendar.MINUTE, 1);
calendar.set(Calendar.SECOND, 0); // 一分钟后执行
Timer timer = new Timer();
/* void java.util.Timer.schedule(TimerTask task, Date time) */
timer.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("-------任务执行--------");
}
}, calendar.getTime());
}
/**
* 第三种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行(三个参数)
* 每隔固定的设定时间执行
*/
public static void timer3() {
Timer timer = new Timer();
System.out.println(Thread.currentThread().getName());
/*
* void java.util.Timer.schedule(TimerTask task, long delay, long
* period)
*/
timer.schedule(new TimerTask() {
public void run() {
/* 子线程进行任务的执行 */
System.out.println(Thread.currentThread().getName());
System.out.println("-------设定要指定任务--------");
}
}, 1000, 1000);
}
}