4.3.1深度定时器(Timer in Depth)

来源:互联网 发布:大唐电信数据所 待遇 编辑:程序博客网 时间:2024/05/16 14:03
     在前面的应用中,在一个非守护任务执行线程中执行它们的任务。此外,一个任务运行可以作为一次执行任务,而其它任务继续重复执行。为了去了解如何选择实现,你需要学习更多关于Timer。
    Note 定时器可以处理当前大量数据的定时任务(几千条任务是不会出现问题的)。在其内部,这个类使用二叉堆去处理它的定时任务队列,以至于花费执行复杂度是O(log n),这里的n就是当前时间安排的定时伤。
     定时器声明了如下的构造器:
       (1)Timer():创建一个新的定时器,它的任务执行线程不能作为一个守护线程执行。
       (2)Timer(boolean isDaemon):创建一个新的执行器,它的定时线程可以指定为一个守护线程运行(通过设置isDaemon为true)。一个守护线程被被脚本请求,这个定时器将会安排重复执行“主要实例的应用”,一旦应用正在执行它就必须运行,但是不要延长应用的生命周期。
       (3)Timer(String name):创建一个新的定时器,它可以拥有指标名的任务执行线程。这个任务执行线程不能作为一个守护线程运行。如果name为null,那么将会抛出java.lang.NullPointException。
        (4)Timer(String name,boolean isDaemon):创建一个新的定时器,它任务执行线程可以指标名称和它可以作为守护线程执行。如果name为null,那么将会抛出NullPointException异常。
   定时器也声明了下面的方法:
        (1)void cancel():结束这个定时器,丢弃任何当前定期的定时任务。这个方法不会干涉当前正在执行的定时任务(当它存在时)。一个定时器结束之后,它执行线程可以优雅的结束,和没有更多定时任务被定时。(一个定时任务的run()方法内部请求cancel()方法时,通过确保正在执行任务是最后任务,和在这个定时器内不在应用。)这个方法可以重复请求,在第二次和随后请求都没有影响。
       (2)int purge():从定时器队列中移除所有取消的定时任务,和返回的定时任务数量将会被移除。请求purge()方法不会对定时器行为产生影响,但是从队列中移除取消定时任务的引用。当这些没有定时任务没有引用,那么它们适合垃圾回收。(大多数方法不需要请求这个方法,这个设计仅仅是给取消大量定时任务的应用。请求purge()从空间中获取时间:这个方法运行时间可能与n+c*log n相等,这里的n是定时任务的数量在队列中,c是取消定时任务的数量。)它允许在这个定时器中,从一个定期定时任务内请求purge()。
       (3)void schedule(Timer task, Date time):按时执行任务。当时间过时,任务计划将会快速执行。当time.getTime()非法时,将会报java.lang.IllegalArgumentException异常,当任务已经存在安排表中或已经取消,将会抛出java.lang.IllegalStateException异常,这时,定时器取消,或任务执行结束;当任务或时间为null,将会出现NullPointException异常。

        除了以上的这些方法,还有:void schedule(TimerTask task, Date firstTime, long period),void schedule(TimerTask task, long delay), void schedule(TimerTask task, long delay, long period), void schedulaAtFixedRate(TimerTask task, Date firstTime, long period),void scheduleAtFixedRate(Time task, long delay, long period).读者可以从Java的文档中了解,这里就不给出详细说明了。

 源码下载:git@github.com:owenwilliam/Thread.git

原创粉丝点击