Java.util.Timer:实现高效定时任务

需积分: 10 8 下载量 26 浏览量 更新于2024-09-12 收藏 15KB TXT 举报
"Java 定时器的使用主要依赖于 `java.util.Timer` 类,它在应用程序开发中常用于执行周期性任务。本文将详细解析如何利用 `Timer` 类进行定时任务的设置,并介绍相关的方法及其用法。" 在 Java 开发中,`java.util.Timer` 类提供了一个方便且高效的方式来实现周期性操作。例如,我们可能需要每隔5分钟执行一次某个特定操作,如检查新邮件。为了实现这样的功能,我们可以创建一个 `Timer` 实例并调度一个 `TimerTask` 来执行任务。 首先,我们需要创建一个 `Timer` 对象,如下所示: ```java private java.util.Timer timer; timer = new Timer(true); ``` 然后,我们可以创建一个 `TimerTask` 的实例,并在其 `run()` 方法中定义要执行的任务,例如调用 `server.checkNewMail()`: ```java timer.schedule(new java.util.TimerTask() { public void run() { //server.checkNewMail(); // 这里写入要执行的任务 } }, 0, 5 * 60 * 1000); ``` 这段代码将在创建 `TimerTask` 后立即执行,并且每隔5分钟再次执行。下面列出 `Timer` 类的一些关键方法: 1. `Timer.schedule(TimerTask task, Date time)`:在指定的时间点执行任务,仅执行一次。 2. `Timer.schedule(TimerTask task, Date firstTime, long period)`:在指定的初始时间开始,并以给定的周期重复执行任务。 3. `Timer.schedule(TimerTask task, long delay)`:延迟指定的毫秒数后执行任务,仅执行一次。 4. `Timer.schedule(TimerTask task, long delay, long period)`:延迟指定的毫秒数后开始执行,并以给定的周期重复执行任务。 5. `Timer.scheduleAtFixedRate(TimerTask task, Date firstTime, long period)`:在指定的初始时间开始,并以固定的延迟执行任务,即使上一次执行超时也不会影响下次执行的时间。 6. `Timer.scheduleAtFixedRate(TimerTask task, long delay, long period)`:延迟指定的毫秒数后开始,并以固定的延迟重复执行任务。 `TimerTask` 是一个抽象类,需要我们继承并覆盖 `run()` 方法来定义任务。它也可以实现 `Runnable` 接口,但通常情况下,直接使用 `TimerTask` 就足够了,因为它提供了取消任务(`cancel()`)和设置任务是否已取消(`isCancelled()`)的功能。 当一个 `TimerTask` 的 `run()` 方法执行时,`Timer` 会通过调用 `wait()` 函数来释放线程,直到预定的执行时间到达。这意味着,如果 `run()` 方法运行时间过长,其他预定的任务可能会被延迟。因此,设计定时任务时应尽量避免长时间阻塞的操作。 另外,需要注意的是,`Timer` 类不是线程安全的,所以在多线程环境中使用时需额外考虑同步问题。此外,当程序退出时,未取消的 `Timer` 任务可能会导致 JVM 延迟关闭,因此在不再需要定时任务时,记得取消任务和停止 `Timer`。 `java.util.Timer` 和 `TimerTask` 提供了在 Java 应用程序中实现定时任务的强大工具,但使用时应注意性能优化和线程安全问题。正确理解和运用这些方法可以大大提高程序的效率和可靠性。
2015-10-14 上传
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及各代码文件中注释