黑马程序员---java中Timer类的介绍以及使用

来源:互联网 发布:人工智能要学单片机吗 编辑:程序博客网 时间:2024/05/16 12:11

-------android培训、java培训、期待与您交流! ----------

Timer 类的签名:public class Timer extends Object

在java.util包下
定义:

 一个线程使用便利类,用于在后台线程中安排将来要执行的任务。任务可以被安排为执行一次,或者在规定的时间间隔内重复执行。

说明:

    每一个Timer对象对应与一个用来顺序执行所有任务的单一后台线程。定时器任务应该迅速完成。如果一个定时器任务占用过多的时间来完成,它会贪婪的占用着定时器的任务执行线程。也就是说这会延迟后续任务的执行,导致在那些耗时任务终于执行完毕后才能执行那些迅速完成的任务。

在最后一个到定时器对象的引用消失并且所有耗时任务执行完成后,定时器的任务执行线程会优雅的终止。(参见垃圾自动回收主题)。然而线程何时被回收是一个随意的时间,即回收垃圾的线程会在不定时的时间间隔运行。默认情况下任务执行线程不是作为守护线程运行,所以它会阻止应用程序被终止。如果一个调用者想要立刻终止一个定时器执行线程,调用者应该调用定时器的Cancel方法。

    如果一个定时器的任务执行线程意外终止,比如调用了它的Stop方法后,任何之后在这个定时器对象上调度新任务会导致IllegalStateException异常,就好像定时器的Cancel方法已经被调用了。

    Timer类是线程安全的:多线程可以共享同一个Timer对象而不用考虑额外的同步。

    本类不提供实时保证:它使用Object的wait(long)方法调度任务。

代替类:

Java5.0推出了java.util.concurrent 包,里面的一个并发工具集ScheduledThreadPoolExecutor是按照一个给定比率或延迟重复执行任务的线程池。它是一个对Timer/TimerTask组合的高效的更灵活的代替,因为它允许多重服务线程,接受各种时间单位,不需要继承TimerTask(只要实现Runnable接口)。配置ScheduledThreadPoolExecutor只有一个线程就等同于Timer。

    重要提示:这个类在大量的并发任务调度下测试(数千个任务测试没有出现问题)。在内部它使用一个二进制堆来代表它的任务队列,所以调度一个任务的开销是O(log n),n是并发调度的任务的数量。

    重要提示:所有的构造器都创建一个定时器线程。

示例程序:

import java.util.Date;import java.util.Timer;import java.util.TimerTask;/** * 编程实现每隔两秒执行一次爆炸任务,然后隔四秒执行,在两秒,在四秒。如此循环。 * @author xij * */public class TraditionalTimerTest{private static int count = 0;public static void main(String[] args){class MyTimerTask extends TimerTask{@Overridepublic void run(){count = (count + 1) % 2;System.out.println("bombing!");new Timer().schedule(new MyTimerTask(), 2000 + 2000 * count);}}new Timer().schedule(new MyTimerTask(), 2000);while (true){System.out.println(new Date().getSeconds());try{Thread.sleep(1000);} catch (InterruptedException e){e.printStackTrace();}}}}




0 0