所有类型的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
java下高精度定时器库_嵌入式Java虚拟机中高精度定时器的实现
最新推荐文章于 2024-03-28 23:30:55 发布
本文探讨了Java定时器框架在J2ME中的应用,特别是在高精度定时需求的嵌入式系统中的局限性。分析了Sun的Timer和TimerTask类,并提出了一种改进的定时器实现,以提高定时精度。通过创建和管理后台线程以及任务队列,改进的定时器能更好地满足实时性和资源受限环境的需求。
摘要由CSDN通过智能技术生成