java Timer学习笔记

原创 2013年09月19日 23:32:52

Java自带的java.util.Timer类,通过调度一个java.util.TimerTask任务。这种方式可以让程序按照某一个频度执行,但不能指定时间运行。用的较少。

任务的调用通过起的子线程进行执行。

java.util.Timer

java.util.TimerTask

一、调用方法:

(1)void java.util.Timer.schedule(TimerTask task, long delay):多长时间(毫秒)后执行任务

(2)void java.util.Timer.schedule(TimerTask task, Date time):设定某个时间执行任务

(3)void java.util.Timer.schedule(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(4)void java.util.Timer.schedule(TimerTask task, Date firstTime, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

(5)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):delay时间后开始执行任务,并每隔period时间调用任务一次。

(6)void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period):第一次在指定firstTime时间点执行任务,之后每隔period时间调用任务一次。

void java.util.Timer.cancel():终止该Timer

boolean java.util.TimerTask.cancel():终止该TimerTask

可以为每个Timer指定多个TimerTask


虽然可通过void java.util.Timer.schedule(TimerTask task, Date firstTime, long period)方法完成“例如:每天上午10点执行一次”的业务,但该实现是基于进行一天(1000 * 60 * 60 * 24毫秒)进行延迟的机制实现的,并不是指定某个具体时间进行执行的。

对于该种需求,可通过Quartz来进行实现


二、方法名称schedule()和scheduleAtFixedRate()两者的区别

当需要根据period区间时间循环多次调用任务的时候,会存在两种不同的策略,两种方法提供了不同的策略。

调用方法(1)、(2)只是单次执行,不存在多次调用任务的情况,所以没有提供scheduleAtFixedRate方法的调用方式。

<1>schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
<2>scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period


三、示例

(1)

/**
 * 第一种方法:设定多长时间(毫秒)后执行任务
 */
public static void timer1() {
	final StopWatch watch = new StopWatch();
	watch.start();
	Timer timer = new Timer();
	/* void java.util.Timer.schedule(TimerTask task, long delay) */
	timer.schedule(new TimerTask() {
		public void run() {
			watch.stop();
			System.out.println("-------任务执行--------");
			System.out.println(watch.getTime());
		}
	}, 2000);// delay=2000毫秒 后执行该任务
}
(2)

/**
 * 第二种方法:设定某个时间执行任务
 */
public static void timer2() {
	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());
}
(3)

/**
 * 第三种方法:设定指定任务task在指定延迟delay后进行固定延迟peroid的执行
 */
public static void timer3() {
	Timer timer = new Timer();
	final StopWatch watch = new StopWatch();
	watch.start();
	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("-------设定要指定任务--------");
			watch.suspend();
			System.out.println(watch.getTime());
			watch.reset();
			watch.start();
		}
	}, 1000, 1000);
}
(4)

/**
 * 固定延迟peroid时间后执行;peroid时间不是以任务执行完的时间为计算起点(某次任务执行完成后,经过peroid时间后再次调用[不是这样的])。
 * 而是每隔peroid时间调用任务一次。当任务执行的时间小于peroid时间,可以保证每隔peroid时间调用一次。
 * 当任务的执行时间大于peroid时间时,从现象上看:任务一执行完,就会立刻进入下一次任务的执行
 */
public static void timer3a() {
	Timer timer = new Timer();
	final StopWatch watch = new StopWatch();
	watch.start();
	timer.schedule(new TimerTask() {
		Integer i = 1;
		public void run() {
			System.out.println(watch.getTime());
			System.out.println("########第" + i + "次执行开始########");
			try {
				Thread.sleep(400);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			System.out.println("########第" + i + "次执行结束########");
			i++;
			watch.reset();
			watch.start();
		}
	}, 1000, 500);
}

period:500毫秒;每次任务执行时间400毫秒;所以每次任务执行完成后到下一次任务调用开始的时间趋近于100毫秒

打印日志信息:

1000
########第1次执行开始########
########第1次执行结束########
109
########第2次执行开始########
########第2次执行结束########
93
########第3次执行开始########
########第3次执行结束########
93
########第4次执行开始########
########第4次执行结束########
93
########第5次执行开始########
########第5次执行结束########
93
########第6次执行开始########
########第6次执行结束########
93
########第7次执行开始########
########第7次执行结束########
93
########第8次执行开始########
当将Thread.sleep(400);修改为Thread.sleep(600)时:

打印日志信息:

1000
########第1次执行开始########
########第1次执行结束########
0
########第2次执行开始########
########第2次执行结束########
0
########第3次执行开始########
########第3次执行结束########
0
########第4次执行开始########
########第4次执行结束########
0
########第5次执行开始########

(5)

/**
 * 第四种方法:安排指定的任务task在指定的时间firstTime开始进行重复的固定速率period执行
 * 每天中午12点都执行一次
 */
public static void timer4() {
	Calendar calendar = Calendar.getInstance();
	calendar.set(Calendar.HOUR_OF_DAY, 12); // 控制时
	calendar.set(Calendar.MINUTE, 0); // 控制分
	calendar.set(Calendar.SECOND, 0); // 控制秒

	Date time = calendar.getTime(); // 得出执行任务的时间,此处为今天的12:00:00

	Timer timer = new Timer();
	/* void java.util.Timer.schedule(TimerTask task, Date firstTime, long period) */
	timer.schedule(new TimerTask() {
		public void run() {
			System.out.println("-------设定要指定任务--------");
		}
	}, time, 1000 * 60 * 60 * 24);// 这里设定将延时每天固定执行
}
(6)

/**
 * 第五种方法:设定指定任务task在指定延迟delay后进行固定频率peroid的执行。
 * timer.schedule和timer.scheduleAtFixedRate的区别:
 * (1)schedule()方法更注重保持间隔时间的稳定:保障每隔period时间可调用一次
 * (2)scheduleAtFixedRate()方法更注重保持执行频率的稳定:保障多次调用的频率趋近于period时间,如果某一次调用时间大于period,下一次就会尽量小于period,以保障频率接近于period
 */
public static void timer5() {
	Timer timer = new Timer();
	/* void java.util.Timer.scheduleAtFixedRate(TimerTask task, long delay, long period) */
	timer.scheduleAtFixedRate(new TimerTask() {
		public void run() {
			System.out.println("-------设定要指定任务--------");
		}
	}, 1000, 500);
}

Java多线程总结(3)— Timer 和 TimerTask深入分析

1. 基本概念  java.util.Timer:是一个实用工具类,该类用来调度一个线程(schedule a thread),使它可以在将来某一时刻执行。 Java的Timer类可以调度一个任务运行...
  • Mark_LQ
  • Mark_LQ
  • 2015年12月15日 22:31
  • 2967

Java中的Timer源码分析及缺陷

使用Timer执行定时任务很简单,一般这样子写: Timer timer = new Timer(); TimerTask task = new TimerTas...
  • u012619640
  • u012619640
  • 2016年02月26日 14:54
  • 2039

Java—Timer和TimerTask详解(常用API)

以下内容根据 The JavaTM Tutorial 和相关API doc翻译整理,以供日后参考: 1.概览 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行...
  • weiguishan
  • weiguishan
  • 2015年02月23日 12:32
  • 1675

Java定时器Timer类的使用

在应用开发当中,经常需要一些周期性的操作,比如每3分钟执行一次操作等,对于这样的操作最为方便、高效的实现方式就是使用java.util.Timer工具类。   Timer直接从Object继承,它相...
  • Kiss_The_sky
  • Kiss_The_sky
  • 2016年12月11日 17:16
  • 476

Java:如何正确使用Timer【java定时器的使用(Timer) 】

Timer是最常被使用到的工具类,使用Timer来调度TimerTask的实现者来执行任务
  • yueaini10000
  • yueaini10000
  • 2016年04月26日 11:02
  • 17770

java timer六种方法

import java.util.Calendar; import java.util.Date; import java.util.Timer; import java.util.TimerT...
  • u012406790
  • u012406790
  • 2016年10月18日 10:38
  • 3614

《Java源码分析》:Timer/TimerTask

《Java源码分析》:Timer在JDK 5.0之前,java.util.Timer/TimerTask是唯一的内置任务调度方法,而且在很长一段时间里很热衷于使用这种方式进行周期性任务调度。本篇博文就...
  • u010412719
  • u010412719
  • 2016年08月05日 22:06
  • 917

Java 中的定时任务:Timer基础 Timer的缺陷 ScheduledExecutorService优势

该文章来自以下两篇文章整理而成: 主要基础: http://blog.csdn.net/chenssy/article/details/32703499 扩展 : http://blog.csdn....
  • u010003835
  • u010003835
  • 2017年05月09日 17:00
  • 889

Java: Timer启用后无法停止?如何停止Timer

利用Timer和TimerTask可以实现定时完成某些任务。但是在运行过程中出现了很奇怪的现象: 所有TimerTask都完成了,按理说线程应该自动退出,但是它却没有!在JDK1.5的文档Timer...
  • github_34606293
  • github_34606293
  • 2017年11月29日 08:58
  • 73

Java Timer的使用(timer.schedule定时执行)

1.概览 Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。 TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务。 ...
  • guoxiaodiu_
  • guoxiaodiu_
  • 2015年07月21日 14:09
  • 3070
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java Timer学习笔记
举报原因:
原因补充:

(最多只允许输入30个字)