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 封装定时器解决多次调用定时器叠加问题及定时器无法清除的问题
封装的定时器
我用C++封装的跨平台定时器类,CppTimer类。目前仅支持单定时器。特分享出来供大家使用。后续我会添加支持多定时器的功能,敬请期待。 用法: 1、解压,放入项目文件夹中; 2、添加入项目; 3、在需要使用定时器的...
51单片机定时器封装,封装了定时器的功能,用时可直接调用相关函数
windows平台下定时器C++简单封装,了解运行原理,玩转定时器
Android中使用CountDownTimer封装CountDownUtil,制作一个简易定时器,详细了解请移步:http://blog.csdn.net/zxc514257857/article/details/75022049
java定时器封装类(包含单次定时,循环定时,停止定时等)
在工程当中,可以在各个文件灵活中使用定时器功能,不用考虑定时中断的位置和设置,就像C#使用定时器一样,申请一个定时器的类,所有的定时即可在当前文件中实现。
封装一个C#的高精度定时器类,利用读取CPU时钟频率,时钟计数进行定时,定时精度可以达到1ms
本文实例讲述了python使用线程封装的一个简单定时器类。分享给大家供大家参考。具体实现方法如下: from threading import Timer class MyTimer: def __init__(self): self._timer= None self._tm = None self....
c++基础封装(线程、锁、定时器、原子操作等),c++封装,接口方便好用。
NULL 博文链接:https://liyaojin.iteye.com/blog/1197191
一个非常简单易用的linux下的C语言的定时器封装接口,使用查询方式,可同时使用不限个数的定时器,还附带有详细的使用demo。
封装的定时器类,采用线程实现,实现定时、相对定时、周期定时执行的功能
用MFC写的多媒体定时器MediaTimer的使用,简单明了。可用于A/D信号转换器的模拟信号采集时定时器的设置,精度很高
使用delphi比较了系统定时器,setevevt函数,多媒体定时器技术定时的时间差,并将多媒体定时器封装成类
从西门子S7-1200编程时发现,原来PLC如此强大,定时器竟然可以想用多少就用多少(有点夸张,但是几百个是没有问题的),而32里面定时器却限制很多,还牵扯到优先级,用起来还是PLC封装好的定时器模块用着方便。...
windows自带的定时器精度一般在10ms量级,精确度不足,在部分需要高...关键的是,该定时器通过类封装后,使用方法与windows定时器类似。 本代码是原代码,属原创代码,是按照现实需求而开发的,具有很高的实用价值。
linux c 开发的定时器,封装为CTimer类,编译运行已通过,包含头文件就可以用,可以节省编码与调试时间,很实用的代码,可以用于项目中的基础库。Timer.h Timer.cpp