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();
}
分享到:
相关推荐
总结起来,通过封装定时器类并采用单例模式,我们可以有效地解决多次调用定时器导致的叠加问题,以及定时器无法清除的问题。这提高了代码的可维护性和资源利用效率,是JavaScript开发中一种实用的优化策略。在实际...
在封装定时器类时,我们需要考虑以下几个关键点: 1. **初始化**:定时器类的构造函数应包含配置参数,如定时器编号、时钟源、工作模式(向上计数、向下计数、中心对齐等)、预分频值和周期值。这样用户在实例化...
我用C++封装的跨平台定时器类,CppTimer类。目前仅支持单定时器。特分享出来供大家使用。后续我会添加支持多定时器的功能,敬请期待。 用法: 1、解压,放入项目文件夹中; 2、添加入项目; 3、在需要使用定时器的...
封装的定时器
Android中使用CountDownTimer封装CountDownUtil,制作一个简易定时器,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/75022049
C++封装定时器的核心在于创建一个类,例如`CMyTimer`,这个类会包含必要的成员变量和方法来管理定时器的生命周期。下面是一些可能的成员: 1. **成员变量**: - `UINT_PTR m_nTimerID`: 用来存储定时器的唯一...
2. **定时器类**:自定义定时器类是程序的核心,它封装了定时任务的创建、管理和执行。此类通常包括启动定时器、停止定时器、设置定时间隔以及根据定时器ID删除定时器等功能。在这个实例中,CTimer可能是此类的名称...
【前端定时器】cocos creator定时器封装可使定时任务不被UI线程暂停.zip 【前端定时器】cocos creator定时器封装可使定时任务不被UI线程暂停.zip 因原生js 在切换页面,如手机app 显示桌面时,js线程被暂停,故...
51单片机定时器封装,封装了定时器的功能,用时可直接调用相关函数
"多媒体时钟实现的高精度定时器类"就是一个针对这种需求的解决方案。多媒体时钟(Multimedia Timer)是Windows API提供的一种能够实现高精度定时的机制,它比标准的系统时钟更精确,可以达到毫秒级的分辨率。 首先...
本文将深入探讨如何在Spring框架中进行动态定时器的封装,结合标签"源码"和"工具",我们将探讨Spring与Quartz库的整合,以及如何通过源码理解其实现机制。 首先,让我们了解一下Spring的定时任务支持。Spring提供了...
使用`std::thread`类可以创建新线程,例如: ```cpp #include #include void worker_function() { // 在这里执行线程任务 } int main() { std::thread worker_thread(worker_function); // 主线程和worker_...
在IT行业中,定时器管理类(Timer Manager Class)是一个至关重要的概念,特别是在系统调度、任务自动化和事件处理等领域。这个类通常用于管理一系列定时任务,根据预设的时间间隔执行特定的功能。下面我们将深入...
在这个场景中,`MediaTimer`是MFC实现的一个多媒体定时器类,它提供了高精度的定时功能,适用于需要精确时间控制的场合,如模拟信号采集。 多媒体定时器与标准Windows定时器相比,主要优势在于其精度。标准的...
封装一个C#的高精度定时器类,利用读取CPU时钟频率,时钟计数进行定时,定时精度可以达到1ms
此外,我们还将讨论如何将多媒体定时器封装成类以供重复使用。 首先,让我们了解每种定时器的基本概念: 1. **系统定时器**:Delphi中的TTimer组件是基于Windows API的SetTimer函数实现的,它提供了一个简单的接口...
本文实例讲述了python使用线程封装的一个简单定时器类。分享给大家供大家参考。具体实现方法如下: from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self....
这个封装类的目的是简化定时任务的管理和调度,使得开发者能够更方便地实现单次定时、循环定时以及停止定时等功能。 首先,让我们深入理解`Timer`类的工作原理。`Timer`类创建了一个后台线程,称为“计时器线程”,...
在实际项目中,这样的封装往往结合具体的业务需求,提供更高级别的接口,如异步任务队列、定时器线程等。 在提供的文件列表中,"线程"可能是包含这个封装线程类的源代码文件,你可以通过查看和学习这个类的实现,...
在这个例子中,开发者创建了一个C++类库,该库包含了对多媒体定时器API的封装,比如`timeBeginPeriod`、`timeSetEvent`、`timeKillEvent`等函数,这些函数用于设置定时器的精度、启动定时器事件和销毁定时器事件。...