`
dongliwei122
  • 浏览: 81426 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

封装的定时器类

    博客分类:
  • Java
阅读更多
package com.hexun.blog.dongliwei.utils;

import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;

/**
 * 封装的定时器类
 *文件名:DTimer.java<br>
 *@author 董利伟<br>
 *版本:<br>
 *描述:<br>
 *创建时间:2007-11-2 上午11:18:10<br>
 *文件描述:<br>
 *修改者:<br>
 *修改日期:<br>
 *修改描述:<br>
 */
public abstract class DTimer {

	private TimerTask timertask;
	private Timer timer = new Timer();
	/**
	 * 创建一个新计时器。相关的线程不 作为守护程序运行。
	 */
	public void setTimer(){
		this.timer = new Timer();
	}
	/**
	 * 创建一个新计时器,可以指定其相关的线程作为守护程序运行。
	 * 如果计时器将用于安排重复的“维护活动”,则调用守护线程,
	 * 在应用程序运行期间必须调用守护线程,但是该操作不应延长
	 * 程序的生命周期。 
	 * @param isDaemon 如果应该将相关的线程作为守护程序运行,则为 true。
	 */
	public void setTimer(boolean isDaemon){
		this.timer = new Timer(isDaemon);
	}
	/**
	 * 创建一个新计时器,其相关的线程具有指定的名称。
	 * 相关的线程不 作为守护程序运行。
	 * @param name 相关线程的名称
	 * @throws NullPointerException
	 */
	public void setTimer(String name)throws NullPointerException{
		this.timer = new Timer(name);
	}
	/**
	 * 创建一个新计时器,其相关的线程具有指定的名称,并且可以指定作为守护程序运行。
	 * @param name 相关线程的名称
	 * @param isDaemon 如果应该将相关的线程作为守护程序运行,则为 true
	 * @throws NullPointerException
	 */
	public void setTimer(String name,boolean isDaemon)throws NullPointerException{
		this.timer = new Timer(name,isDaemon);
	}
	/**
	 * 安排在指定延迟后执行指定的任务。
	 * @param delay 执行任务前的延迟时间,单位是毫秒。
	 */
	public void schedule(long delay)throws IllegalArgumentException,IllegalStateException{
		if(this.timer == null){
			this.timer = new Timer();
		}
		this.timertask = new DTask();
		this.timer.schedule(this.timertask,delay);
	}
	/**
	 * 安排在指定的时间执行指定的任务。如果此时间已过去,则安排立即执行该任务。
	 * @param date 执行任务的时间
	 */
	public void schedule(Date date)throws IllegalArgumentException,IllegalStateException{
		if(this.timer == null){
			this.timer = new Timer();
		}
		this.timertask = new DTask();
		this.timer.schedule(this.timertask,date);
	}
	/**
	 * 安排指定的任务从指定的延迟后开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。
	 * 在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)而
	 * 延迟了某次执行,则后续执行也将被延迟。从长期来看,执行的频率一般要稍慢于指定周期的倒数(假定 Object.wait(long)
	 * 所依靠的系统时钟是准确的)。 固定延迟执行适用于那些需要“平稳”运行的重复活动。换句话说,它适用于在短期运行
	 * 中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包括为响
	 * 应人类活动所执行的固定活动,如在按住键时自动重复输入字符。 
	 * @param delay 执行任务前的延迟时间,单位是毫秒
	 * @param period 执行各后续任务之间的时间间隔,单位是毫秒
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	public void schedule(long delay,long period)throws IllegalArgumentException,IllegalStateException{
		if(this.timer == null){
			this.timer = new Timer();
		}
		this.timertask = new DTask();
		this.timer.schedule(this.timertask,delay,period);
	}
	/**
	 * 安排指定的任务在指定的时间开始进行重复的固定延迟执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。 
	 * 在固定延迟执行中,根据前一次执行的实际执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他后台活动)
	 * 而延迟了某次执行,则后续执行也将被延迟。在长期运行中,执行的频率一般要稍慢于指定周期的倒数(假定 Object.wait(long) 
	 * 所依靠的系统时钟是准确的)。 固定延迟执行适用于那些需要“平稳”运行的重复执行活动。换句话说,它适用于在短期
	 * 运行中保持频率准确要比在长期运行中更为重要的活动。这包括大多数动画任务,如以固定时间间隔闪烁的光标。这还包
	 * 括为响应人类活动所执行的固定活动,如在按住键时自动重复输入字符。 
	 * @param firstTime 首次执行任务的时间
	 * @param period 执行各后续任务之间的时间间隔,单位是毫秒
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	public void schedule(Date firstTime,long period)throws IllegalArgumentException,IllegalStateException{
		if(this.timer == null){
			this.timer = new Timer();
		}
		this.timertask = new DTask();
		this.timer.schedule(this.timertask,firstTime,period);
	}
	/**
	 * 安排指定的任务在指定的延迟后开始进行重复的固定速率执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。 
	 * 在固定速率执行中,根据已安排的初始执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他背景活动)而延迟
	 * 了某次执行,则将快速连续地出现两次或更多的执行,从而使后续执行能够“追赶上来”。从长远来看,执行的频率将正好是
	 * 指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。 固定速率执行适用于那些对绝对 时间敏
	 * 感的重复执行活动,如每小时准点打钟报时,或者在每天的特定时间运行已安排的维护活动。它还适用于那些完成固定次数
	 * 执行的总计时间很重要的重复活动,如倒计时的计时器,每秒钟滴答一次,共 10 秒钟。最后,固定速率执行适用于安排多
	 * 个重复执行的计时器任务,这些任务相互之间必须保持同步。
	 * @param delay 执行任务前的延迟时间,单位是毫秒。
	 * @param period 执行各后续任务之间的时间间隔,单位是毫秒。
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	public void scheduleAtFixedRate(long delay,long period)throws IllegalArgumentException,IllegalStateException{
		if(this.timer == null){
			this.timer = new Timer();
		}
		this.timertask = new DTask();
		this.timer.scheduleAtFixedRate(this.timertask,delay,period);
	}
	/**
	 * 安排指定的任务在指定的时间开始进行重复的固定速率执行。以近似固定的时间间隔(由指定的周期分隔)进行后续执行。 
	 * 在固定速率执行中,相对于已安排的初始执行时间来安排每次执行。如果由于任何原因(如垃圾回收或其他背景活动)而
	 * 延迟了某次执行,则将快速连续地出现两次或更多次执行,从而使后续执行能够赶上来。从长远来看,执行的频率将正好
	 * 是指定周期的倒数(假定 Object.wait(long) 所依靠的系统时钟是准确的)。 固定速率执行适用于那些对绝对时
	 * 间敏感的重复执行活动,如每小时准点打钟报时,或者在每天的特定时间运行已安排的维护活动。它还适用于那些完成固
	 * 定次数执行的总计时间很重要的重复活动,如倒计时的计时器,每秒钟滴答一次,共 10 秒钟。最后,固定速率执行适用
	 * 于安排多次重复执行的计时器任务,这些任务相互之间必须保持同步。
	 * @param firstTime 首次执行任务的时间
	 * @param period 执行各后续任务之间的时间间隔,单位是毫秒
	 * @throws IllegalArgumentException
	 * @throws IllegalStateException
	 */
	public void scheduleAtFixedRate(Date firstTime,long period)throws IllegalArgumentException,IllegalStateException{
		if(this.timer == null){
			this.timer = new Timer();
		}
		this.timertask = new DTask();
		this.timer.scheduleAtFixedRate(this.timertask,firstTime,period);
	}
	
	private class DTask extends TimerTask{
		public void run() {
			work();
		}
	}
	/**
	 * 取消此计时器任务。如果任务安排为一次执行且还未运行,或者尚未安排,则永远不会运行。如果任务安排为重复执行,
	 * 则永远不会再运行。(如果发生此调用时任务正在运行,则任务将运行完,但永远不会再运行。) 注意,从重复的计时
	 * 器任务的 run 方法中调用此方法绝对保证计时器任务永远不会再运行。 此方法可以反复调用;第二次和以后的调用无效。
	 * @return 如果此任务安排为一次执行且尚未运行,或者此任务安排为重复执行,则返回 true。
	 *         如果此任务安排为一次执行且已经运行,或者此任务尚未安排,或者此任务已经取消,
	 *         则返回 false。(一般来说,如果此方法阻止发生一个或多个安排执行,则返回 true。)
	 */
	public boolean cancel(){
		if(this.timertask == null){
			return true;
		}
		if(this.timer == null){
			return true;
		}
		boolean bn = this.timertask.cancel();
		this.timer.cancel();
		this.timertask = null;
		this.timer = null;
		return bn;
	}
	/**
	 * 返回此任务最近实际 执行的安排 执行时间。(如果在任务执行过程中调用此方法,则返回值为此任务执行的安排执行时间。)
	 * 通常从一个任务的 run 方法中调用此方法,以确定当前任务执行是否能充分及时地保证完成安排活动: 
	 * public void run() {
	 * 		if (System.currentTimeMillis() - scheduledExecutionTime() >=MAX_TARDINESS){
	 * 			return;  // Too late; skip this execution.
	 * 			// Perform the task
	 * 		} 
	 * }
	 * 通常,此方法不 与固定延迟执行 的重复任务一起使用,因为其安排执行时间允许随时间浮动,所以毫无意义。
	 * @return 最近发生此任务执行安排的时间,采用 Date.getTime() 返回的格式。如果任务已开始其首次执行,则返回值不确定。
	 */
	public long scheduledExecutionTime(){
		if(this.timertask == null){
			return 0;
		}
		return this.timertask.scheduledExecutionTime();
	}
	/**
	 * 用于判断该定时器是否活动 
	 */
	public boolean isAlive(){
		if(this.timer == null){
			return false;
		}
		return true;
	}
	/**
	 * 将要执行的任务,用于让其子类进行覆盖
	 */
	public abstract void work();
}
分享到:
评论

相关推荐

    js 封装定时器解决多次调用定时器叠加问题及定时器无法清除的问题

    总结起来,通过封装定时器类并采用单例模式,我们可以有效地解决多次调用定时器导致的叠加问题,以及定时器无法清除的问题。这提高了代码的可维护性和资源利用效率,是JavaScript开发中一种实用的优化策略。在实际...

    stm32 实现定时器类

    在封装定时器类时,我们需要考虑以下几个关键点: 1. **初始化**:定时器类的构造函数应包含配置参数,如定时器编号、时钟源、工作模式(向上计数、向下计数、中心对齐等)、预分频值和周期值。这样用户在实例化...

    仿照vc定时器,我自己封装的CppTimer定时器类

    我用C++封装的跨平台定时器类,CppTimer类。目前仅支持单定时器。特分享出来供大家使用。后续我会添加支持多定时器的功能,敬请期待。 用法: 1、解压,放入项目文件夹中; 2、添加入项目; 3、在需要使用定时器的...

    封装的定时器

    封装的定时器

    Android中使用CountDownTimer封装CountDownUtil,制作一个简易定时器

    Android中使用CountDownTimer封装CountDownUtil,制作一个简易定时器,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/75022049

    定时器C++封装

    C++封装定时器的核心在于创建一个类,例如`CMyTimer`,这个类会包含必要的成员变量和方法来管理定时器的生命周期。下面是一些可能的成员: 1. **成员变量**: - `UINT_PTR m_nTimerID`: 用来存储定时器的唯一...

    自定义定时器类实现实例程序

    2. **定时器类**:自定义定时器类是程序的核心,它封装了定时任务的创建、管理和执行。此类通常包括启动定时器、停止定时器、设置定时间隔以及根据定时器ID删除定时器等功能。在这个实例中,CTimer可能是此类的名称...

    51单片机定时器的封装

    51单片机定时器封装,封装了定时器的功能,用时可直接调用相关函数

    多媒体时钟实现的高精度定时器类

    "多媒体时钟实现的高精度定时器类"就是一个针对这种需求的解决方案。多媒体时钟(Multimedia Timer)是Windows API提供的一种能够实现高精度定时的机制,它比标准的系统时钟更精确,可以达到毫秒级的分辨率。 首先...

    spring动态定时器封装

    本文将深入探讨如何在Spring框架中进行动态定时器的封装,结合标签"源码"和"工具",我们将探讨Spring与Quartz库的整合,以及如何通过源码理解其实现机制。 首先,让我们了解一下Spring的定时任务支持。Spring提供了...

    c++基础封装(线程、锁、定时器、原子操作等)

    使用`std::thread`类可以创建新线程,例如: ```cpp #include #include void worker_function() { // 在这里执行线程任务 } int main() { std::thread worker_thread(worker_function); // 主线程和worker_...

    定时器管理类

    在IT行业中,定时器管理类(Timer Manager Class)是一个至关重要的概念,特别是在系统调度、任务自动化和事件处理等领域。这个类通常用于管理一系列定时任务,根据预设的时间间隔执行特定的功能。下面我们将深入...

    多媒体定时器的设置和释放等

    在这个场景中,`MediaTimer`是MFC实现的一个多媒体定时器类,它提供了高精度的定时功能,适用于需要精确时间控制的场合,如模拟信号采集。 多媒体定时器与标准Windows定时器相比,主要优势在于其精度。标准的...

    高精度定时器类,利用CPU时钟定时

    封装一个C#的高精度定时器类,利用读取CPU时钟频率,时钟计数进行定时,定时精度可以达到1ms

    delphi 几个定时器方法的比较

    此外,我们还将讨论如何将多媒体定时器封装成类以供重复使用。 首先,让我们了解每种定时器的基本概念: 1. **系统定时器**:Delphi中的TTimer组件是基于Windows API的SetTimer函数实现的,它提供了一个简单的接口...

    python使用线程封装的一个简单定时器类实例

    本文实例讲述了python使用线程封装的一个简单定时器类。分享给大家供大家参考。具体实现方法如下: from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self....

    定时器的封装类,可直接并列com包使用

    这个封装类的目的是简化定时任务的管理和调度,使得开发者能够更方便地实现单次定时、循环定时以及停止定时等功能。 首先,让我们深入理解`Timer`类的工作原理。`Timer`类创建了一个后台线程,称为“计时器线程”,...

    线程封装类

    在实际项目中,这样的封装往往结合具体的业务需求,提供更高级别的接口,如异步任务队列、定时器线程等。 在提供的文件列表中,"线程"可能是包含这个封装线程类的源代码文件,你可以通过查看和学习这个类的实现,...

    C#调用多媒体定时器

    在这个例子中,开发者创建了一个C++类库,该库包含了对多媒体定时器API的封装,比如`timeBeginPeriod`、`timeSetEvent`、`timeKillEvent`等函数,这些函数用于设置定时器的精度、启动定时器事件和销毁定时器事件。...

    实用的Linux c 定时器代码

    总的来说,CTimer类封装了Linux下的定时器功能,提供了一种方便的方式来在C++项目中实现定时任务,降低了开发者的编程负担,并提高了代码的可复用性。通过理解和使用CTimer,开发者可以更好地掌握Linux系统编程中的...

Global site tag (gtag.js) - Google Analytics