java技术--Timer(定时器)

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);
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值