`
kavy
  • 浏览: 888067 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

使用java.util.Timer

 
阅读更多

在应用开发中,经常需要一些周期性的操作,比如每5分钟检查一下新邮件等。对于这样的操作最方便、高效的实现方式就是使用java.util.Timer工具类。比如下面的代码每5分钟检查一遍是否有新邮件:
        private java.util.Timer timer;
        timer = new Timer(true);
        timer.schedule(new java.util.TimerTask() {
            public void run() {
                    //server.checkNewMail(); 检查新邮件
            }
        }, 0, 5*60*1000);

使用这几行代码之后,Timer本身会每隔5分钟调用一遍server.checkNewMail()方法,不需要自己启动线程。Timer本身也是多线程同步的,多个线程可以共用一个Timer,不需要外部的同步代码。
    在《The Java Tutorial》中有更完整的例子:
public class AnnoyingBeep {
    Toolkit toolkit;
    Timer timer;

    public AnnoyingBeep() {
    toolkit = Toolkit.getDefaultToolkit();
        timer = new Timer();
        timer.schedule(new RemindTask(),
                   0,        //initial delay
                   1*1000);  //subsequent rate
    }

    class RemindTask extends TimerTask {
    int numWarningBeeps = 3;

        public void run() {
        if (numWarningBeeps > 0) {
            toolkit.beep();
        System.out.println("Beep!");
        numWarningBeeps--;
        } else {
            toolkit.beep(); 
                System.out.println("Time's up!");
            //timer.cancel(); //Not necessary because we call System.exit
            System.exit(0);   //Stops the AWT thread (and everything else)
        }
        }
    }
    ...
}
这段程序,每隔3秒响铃一声,并打印出一行消息。循环3次。程序输出如下:
Task scheduled.
Beep!      
Beep!      //one second after the first beep
Beep!      //one second after the second beep
Time's up! //one second after the third beep

Timer类也可以方便地用来作为延迟执行,比如下面的代码延迟指定的时间(以秒为单位)执行某操作。类似电视的延迟关机功能。
...
public class ReminderBeep {
    ...
    public ReminderBeep(int seconds) {
    toolkit = Toolkit.getDefaultToolkit();
        timer = new Timer();
        timer.schedule(new RemindTask(), seconds*1000);
    }

    class RemindTask extends TimerTask {
        public void run() {
            System.out.println("Time's up!");
        toolkit.beep();
        //timer.cancel(); //Not necessary because we call System.exit
        System.exit(0);   //Stops the AWT thread (and everything else)
        }
    }
    ...
}


1. 有朋友来信问,希望自己的Task一直运行,而不是像上面的RemindTask那样仅循环3次。
这很简单,可能这位朋友把Task的作用理解有误,Task仅代表了一次的动作。而不是让Task完成循环。上面的RemindTask中之所以有一个计数,是因为要运行3次停止,如果需要一直保持运行。把上面有关的计数的代码全部去除即可。其实Timer中并没有提供运行指定次数后即停止的机制,所以,上面的计数满足了这个功能需要。

2. 能否设置Timer的优先级?
Timer中是利用一个线程来进行计时及周期触发动作的。现在的Timer实现中并没有提供设置优先级的方法,在你调用new Timer()时线程已经启动,所以,除非Timer的以后版本中在构造方法中增加优先级参数,否则,我们是不能控制其优先级的。现在的Timer默认是在Thread.NORM_PRIORITY优先级下运行的。但是Timer提供了一个Timer(boolean isDaemon)的构造方法,可以将Timer设置为daemon线程。这样,在你的程序中其它线程都运行完毕后,程序就可以退出了。

3. Timer是不是实现了精确地定时?
否。Timer中也是采用Object.wait(long time)来实现定时的,由于Object.wait()不保证精确计时,所以Timer也不是一个精确的时钟。如果是实时系统,不能依赖Timer。

4. (liangyiqing)假如我在一个Timer类里面再定义一个Timer类,如果外层定义的时间是24小时循环一次,而内层定义的是1小时循环一次,意思就是当一个小时内层运行完一次之后,内层Timer释放资源,我想问,外层的Timer是不是也会释放,还是24小时之中一直都在占用?
我不太清楚你的占用资源是什么意思,如果你在Task中用到一些资源,这些资源应该在Task运行结束后即刻释放,尤其对竞态条件,更应该占用尽量少的时间。一般来说,一次Task的运行时间,将少于你设定的周期。否则,Task将在Timer中堆积起来。如果你要实现上面说的每24小时和每1小时两个周期的操作,可以使用一个Timer,schedule两个Task即可。

5. Timer是否可以在多线程环境下使用?
可以。Timer中用于存储Task的容器是同步了的,保证了多线程环境先的安全使用。

6. (austin1979 )请问,定时的时间能为变量,可以在程序中变化吗?就是说定时的时间可以又界面来控制。
一个Timer可以控制任意多个Task的不同周期设定的触发。也就是说,这个Timer类似于可以定多个时间的闹钟,比如我的手机就有3个闹钟 :)  。但是一旦一个Task 已经进行了schedule了,那么就不能再次进行设定。所以,也不可能再改变其周期、延迟等等设定了。可以看下面的代码:
            synchronized(task.lock) {
                if (task.state != TimerTask.VIRGIN)
                    throw new IllegalStateException(
                        "Task already scheduled or cancelled");
                task.nextExecutionTime = time;
                task.period = period;
                task.state = TimerTask.SCHEDULED;
            }

7. (eqingtian)可不可以认为Timer就是一个线程的发射器?
Timer中仅有一个存储Task的Queue和一个调度所有Task的线程。不管你schedule几次,在Timer上加了几个Task,都只有一个后台的线程进行调度。

2004年8月13日 9:53



本文引用通告地址: http://www.donews.net/dyhcn/services/trackbacks/124152.aspx 

分享到:
评论

相关推荐

    java.util.timer实现的简单定时任务

    timer.scheduleAtFixedRate(task, 0, 5000); // 第二个参数为首次执行延迟,第三个参数为周期 ``` 需要注意的是,`Timer`并不是线程安全的,如果你在一个多线程环境中使用同一个Timer实例来调度任务,可能会遇到...

    java.util.ConcurrentModificationException 异常问题详解1

    Java.util.ConcurrentModificationException 异常问题详解 ConcurrentModificationException 异常是 Java 中一个常见的异常,它发生在 Iterator 遍历集合时,集合同时被修改引起的异常。在 Java 中,集合类如 ...

    java.util.pdf

    同时,提及了Timer和TimerTask,它们用于任务调度,这是java.util的一部分,用于在后台线程中安排任务执行。另外,还提到了异常类EmptyStackException和NoSuchElementException,它们分别在Stack类和Enumeration接口...

    java.sql.date与java.util.date.pdf

    同理,当你从数据库中获取到一个`java.sql.Date`对象,且需要在Java程序中作为标准的日期时间处理时,可以使用`new java.util.Date(java.sql.Date的时间戳)`来转换。 在使用`PreparedStatement`设置日期值时,通常...

    java.util.concurrent.uml.pdf

    标题中提到了“java.util.concurrent.uml.pdf”,这表明文件是一份Java并发编程工具包java.util.concurrent的UML(统一建模语言)类结构图的PDF格式文件。UML图能够帮助开发者理解Java并发包中的类、接口及其关系,...

    java.util包总结

    Java.util包是Java标准库中的核心包之一,它包含了大量用于日常编程的工具类和接口。这个包在Java 2版本中得到了显著增强...通过熟练掌握和使用java.util包中的类和接口,开发者能够更加高效地处理数据和实现复杂逻辑。

    java timer定时器详解(附详细代码)

    Java Timer定时器详解 Java Timer定时器是Java语言中的一种常用的定时器机制,它可以帮助开发者实现一些需要在特定时间或...通过使用java.util.Timer和java.util.TimerTask两个类,开发者可以轻松地实现定时器的功能。

    使用java.util.Timer实现任务调度

    它与 `java.util.TimerTask` 类配合使用,`TimerTask` 是一个抽象类,代表要定时执行的任务。下面我们将深入探讨这两个类以及如何使用它们实现任务调度。 1. **Timer类**: - `Timer` 类是一个线程类,它创建一个...

    java定时任务

    java提供了多种方式来实现定时任务,包括使用java.util.Timer和java.util.TimerTask类、使用java.lang.Thread类的sleep方法、使用java.util.concurrent.ScheduledExecutorService类等。 在本例子中,使用的是java....

    Timer-java.rar_java timer_timer_timer java

    在Java编程语言中,`Timer`类是Java.util包下的一个关键组件,它主要用于调度周期性的任务执行。这个`Timer`类提供了定时器的功能,能够按照预设的时间间隔执行任务,比如更新UI、执行定时检查等。在描述中提到的是...

    java-clock.rar_Java 小程序_clock_java clock

    timer.scheduleAtFixedRate(new TimerTask() { @Override public void run() { // 更新时间并设置到标签 clockLabel.setText(formatCurrentTime()); } }, 0, 1000); // 每秒更新一次 ``` 5. `...

    Timer累计计时器,利用系统时间计时 含代码注释

    例如,在Java中,我们可以使用java.util.Timer类;在C#中,可以使用System.Timers.Timer类;在Python中,可以使用threading模块的Timer类。 二、累计计时的原理 累计计时是指从开始到结束,连续计算经过的时间。在...

    java定时器代码

    它使用`java.util.TimerTask`作为任务的具体实现类,通过`Timer`调度`TimerTask`来完成定时任务的执行。 #### 三、`java.util.Timer`与`java.util.TimerTask`详解 ##### 3.1 `java.util.Timer` `Timer`类是Java...

    java每天实现定点执行任务

    timer.scheduleAtFixedRate(task, calendar.getTime(), 24 * 60 * 60 * 1000); // 每天执行一次 ``` 2. **使用java.util.concurrent.ScheduledExecutorService** `ScheduledExecutorService`提供了一种更灵活的...

    Java期末复习-常用类库

    定时调度可以使用java.util.Timer和java.util.TimerTask,或使用更现代的java.concurrent包中的ScheduledExecutorService。 以上就是Java常用类库的一些核心知识点,涵盖了字符串处理、系统交互、国际化、日期时间...

    java GUI时钟小程序

    要实现时钟功能,开发者通常会使用java.util.Timer或javax.swing.Timer类来定期执行任务,比如每秒更新时间。Timer类允许设置间隔时间,当时间到达时,它会触发一个动作事件,这个事件通常用来更新UI上的时间显示。...

    llk--java.rar_java 游戏_java 连连看 游戏_llk_简单 连连看 java

    此外,游戏还包括计时功能,通常使用java.util.Timer和TimerTask类来实现定时事件,如倒计时或刷新游戏状态。 在实际的“连连看--java”项目中,www.pudn.com.txt可能是开发者发布代码或资源时留下的说明文档,而...

    java定时进行webservice数据上报

    3. 定时任务:在Java中,有多种方式可以实现定时任务,如使用java.util.Timer和TimerTask类、ScheduledExecutorService接口(属于java.util.concurrent包)以及Spring框架的定时任务支持。ScheduledExecutorService...

    schedule

    通过上述内容,我们不仅了解了如何在Java中使用`java.util.Timer`和`java.util.TimerTask`来实现定时任务,而且还学习了如何在Web应用中利用这些工具来完成周期性的任务。这种方法特别适用于需要定期执行某些操作的...

    基于NetBeans开发的java应用程序集锦1

    7. **数字时钟**:可以使用java.util.Timer和java.util.Calendar类来更新时间,并在JLabel或其他组件上显示。定时器会定期触发事件,更新时钟显示。 8. **动画效果**:Java的javax.swing.Timer可以实现GUI的动画...

Global site tag (gtag.js) - Google Analytics