java下高精度定时器库_嵌入式Java虚拟机中高精度定时器的实现

本文探讨了Java定时器框架在J2ME中的应用,特别是在高精度定时需求的嵌入式系统中的局限性。分析了Sun的Timer和TimerTask类,并提出了一种改进的定时器实现,以提高定时精度。通过创建和管理后台线程以及任务队列,改进的定时器能更好地满足实时性和资源受限环境的需求。
摘要由CSDN通过智能技术生成

所有类型的Java应用程序一般都需要计划重复执行的任务。企业应用程序需要计划每日的日志或者晚间批处理过程。一个J2SE或者J2ME日历应用程序需要根据用户的约定计划闹铃时间[1]。Sun提供的JavaAPI中类Timer和TimerTask被用来完成这些任务的实现和调度。java.util.Time和java.util.TimerTask统称为Java定时器框架,它们使程序员可以计划简单的任务,开发人员必须编写自己的调度程序,这需要花费很大精力来处理线程和复杂的Object.wait()方法。不过,Java定时器框架没有足够的能力来满足许多应用程序的计划要求。在一些实时性要求高的系统中,尤其是一些资源受限的嵌入式系统中,它的精确度是个很值得研究的问题。本文分析了Sun的定时器框架,展示了一个用其他机制重新实现的定时器,从而使其达到更高精确度。1定时器的介绍J2ME是一种以广泛的消费性产品为目标的高度优化的Java运行时环境,包括寻呼机、移动电话、可视电话、数字机顶盒和汽车导航系统,是SUN致力于消费产品和嵌入式设备的最佳解决方案。随着嵌入式设备如手机、PDA的普及,J2ME得到了广泛应用。它提供了两个类用来定义和调试任务,分别是TimerTask和Timer,他们被称为定时器框架。TimerTask是用户定义的需要被调度的所有任务的抽象基类。Timer类在任务执行的时候负责创建和管理执行线程。要定义一个任务,定义一个TimerTask的子类,并实现run方法。例如:importjava.util.*;publicclassMyTaskextendsTimerTaskpublicvoidrun()System.out.println("Runningthetask");TimerTask实现了java.lang.Runnable接口。Timer类调用这个run方法来执行各个任务。此外还有一点必须注意到,那就是每个run方法所执行的任务必须能够尽快的终止,因为每个Timer对象在同一时间只能执行一个任务。定义好一个任务以后,你可以生成一个Timer对象并调用schedule方法来调度它,就像下面的代码演示的那样[2]:importjava.util.*;Timertimer=newTimer();TimerTasktask=newMyTask();//在执行这个任务前等待10s...timer.schedule(task,10000);//在执行任务前等待10s,然后每过10s再执行一次Timer.schedule(task,5000,10000);2传统定时器的实现原理每个Timer对象都会创建和管理一个后台线程Timer-Thread和一个任务队列TaskQueue,TaskQueue存放的是这个Timer要执行的任务,TimerThread来调度和运行这些任务,每次从TaskQueue中取出运行时刻最早的任务,如果当前时刻(currentTime)不早于运行时刻(executionTime)则运行,否则线程进入睡眠(wait(executionTime-currentTime))。睡眠的唤醒可能出于以下原因之一:(1)另一个线程调用对象的notify()或者notifyAll()方法。(2)线程被另一个线程中断。(3)在没有通知的情况下,线程被唤醒(称为spuriouswakeup,JoshuaBloch的EffectiveJavaProgrammingLanguageGuide一书中Item50对其进行了描述)。(4)规定的时间已到。对于Ti

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JAVA精确定时器,利用系统时间,使长期工作的误差稳定。 功能: ·可定时启动任务或直接启动任务 ·重复启动任务(时间间隔可在任务线程改变,范围大于100ms,否则精度降低) 引用列表: ·import psn.razerpen.thread.AccuracyTimer; ·import psn.razerpen.thread.AccuracyTimerMission; ·import psn.razerpen.time.TimeStruct; 使用方法: //1·继承AccuracyTimerMission接口,创建一个类。 class MyTimer implements AccuracyTimerMission { //2·指定一个周期 int nDelay=1000; //3·重写run方法(如不需要使用新线程执行任务,也可留空) /** * 任务线程,本函数继承自Runnable */ @Override public void run() { System.out.println(new TimeStruct()); } //4·重写RunInCurrentThread(long nCurrentMilliSecond)方法。该方法接收当前时间,并返回下一次执行的时间。如果返回值不大于nCurrentMilliSecond则止计时器。该方法必须重写。 /** * 接收当前时间的毫秒值,并返回下一次执行的毫秒值。如果返回的下一个时间早于当前时间,则退出 */ @Override public long RunInCurrentThread(long nCurrentMilliSecond) { return nCurrentMilliSecond+=nDelay; } } //5·创建主线程代码 public class TestTimer { public static void main(String[] args) throws InterruptedException { //6·创建一个AccuracyTimer对象,并指定一个任务。 AccuracyTimer at=new AccuracyTimer(new MyTimer()); //7·(可选)如果不需要在新线程启动任务,则写 // at.SetNewThreadEnabled(false); //否则不写或者写 // at.SetNewThreadEnabled(true); //8·(可选)设定第一次启动的时间点SetNextMissionTime/SetNextMissionMilliSecond或延迟时间SetNextMissionMilliSecondFromNow //设置为当前这一分钟的第59秒后启动(不写此行则表示直接启动) at.SetNextMissionTime(Integer.MIN_VALUE, -1, -1, -1, -1, 59, 0); //9·启动定时器 at.Start(); //10·主线程继续 for(int i=0;i<60;++i){ Thread.sleep(1000); } //11·结束定时器 at.End(); } } 详见sample.razerpen.thread包TestTimer及各代码文件注释
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值