`
houkai2009
  • 浏览: 228946 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论
  • 浪迹随风: 文章是挺好的,不过太杂了。。。信息量也很大。。。很难消化。。。 ...
    EJB 介绍
  • javaersu: yds3300376yd 写道学习了,只是楼主写的有点杂,现在 ...
    EJB 介绍
  • yds3300376yd: 学习了,只是楼主写的有点杂,现在还看不太懂,刚学习EJB,我觉 ...
    EJB 介绍
  • javaersu: 不错,这里也有一篇类似的EJB文章教程http://www.y ...
    EJB 介绍
  • dingding5060: brother , 你贴代码想说明什么???
    enum

java.util.Timer

    博客分类:
  • java
 
阅读更多

1。Timer是用来干什么用的?
2。如何来使用one-time execution, 和repeated execution?
3。Timer总共启用了几个线程?
4。Timer执行精确吗?
5。Timer的原理简单介绍。
6。schedule()和scheduleAtFixRate() 有什么区别?

1。Timer是用来干什么用的?
       javadoc上是这么说的:A facility for threads to schedule tasks for future execution in a background thread.  Tasks may be scheduled for one-time execution, or for repeated execution at regular intervals.

2。如何来使用one-time execution, 和repeated execution?
      一次执行:
           Timer timer = new Timer();
           最简单的是timer.schedule(timertask, long), 或者timer.schedule(timertask, date)。如果调用timer,schedule(timertask,long,0)也是一次执行。
     
      多次执行:
           timer.schedule(timertask, long , long), 或者timer.scheduleAtFixRate(timertask, long , long);注意第三个参数须是正数。

3。Timer总共启用了几个线程?
        新建一个Timer对象,就会新建一个伴随的线程,而且也是唯一的一个线程,该线程负责进行任务的调度和任务的执行
        用户在用户线程里(如mainthread)添加任务或者取消任务。
        用户可以在新建Timer的时候来传递一个boolean值给timer, 如new Timer(true), 这样伴随线程就是daemon线程了,在其它的非daemon的死亡之后也会自动死亡。

4。Timer执行精确吗?
        正是因为Timer采用一个线程来进行所有任务的调度和执行,所以即使我们不去计较任务的调度所要花费的时间,时间点靠后的任务也必须等到时间点比自己靠前的任务全部都执行完毕了之后才可以执行,如果时间点靠前的任务的执行需要花费很长的时间(执行时间大于它与后边的任务的时间差),那么后面的任务没有一点办法,只有延时执行。正因为如此,用timer 的前提是各个任务的执行时间相对来说比较短,否则肯定不准确。

5。Timer的原理简单介绍。
        使用一个queue来存放所有的任务,执行时间早的任务放在队列的前面,每次新加入一个任务,就要对队列重新排队,以保证时间的顺序正确。
         由执行线程在一个无限循环中来对任务进行轮询:1,如果队列中没有任务,queue.wait(). 2.有任务,取出第一个任务(也就是最早的一个任务)3,如果取出的任务的执行时间已过,马上执行之,否则,等待。queue.wait(long)。 4,如果任务是多次执行,那么在任务的执行时间的基础上加上对应的时间间隔,然后对queue重新排队。

6。schedule()和scheduleAtFixRate() 有什么区别?
        对于多次执行的任务,每个任务的执行时间并不一定是用户期望的时间,有可能是延时执行了。所以expectedtime, realtime之间是有差距的。schedule()的含义就是下次同一任务的执行时间的理论值=realtime+period
      scheduleAtFixRate()的含义就是下一次同一任务的执行时间的理论值=expectedtime+period
      也就是说schedule()的多次执行的第n+1次执行的真正执行的时间并不是第一次时间+n*period, 而是要加上前面的每次的延时时间
      scheduleAtFixRate()的多次执行的第n+1次执行的真正执行时间就是第一次时间+n*period      

分享到:
评论

相关推荐

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

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

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

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

    java.util.concurrent.uml.pdf

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

    java.util.pdf

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

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

    Java提供了多个类和接口来处理日期和时间,其中`java.util.Date`和`java.sql.Date`是两个经常被混淆和讨论的类,尤其是在数据库编程中。由于这两个类在概念和功能上有所不同,理解它们之间的区别对于编写有效的Java...

    java.util包总结

    Java.util包是Java标准库中的核心包之一,它包含了大量用于日常编程的工具类和接口。这个包在Java 2版本中得到了显著增强,引入了许多重要的数据结构和算法,为Java程序员提供了更丰富的功能。 首先,Java.util包中...

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

    timer.scheduleAtFixedRate(task, 1 * 60 * 1000, 10 * 60 * 1000); } } ``` 在上述例子中,任务将在启动后1分钟首次运行,并每隔10分钟运行一次。`scheduleAtFixedRate()` 方法用于安排周期性的任务执行,第一个...

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

    timer.schedule(new MyTask(), 1000, 2000);//在 1 秒后执行此任务,每次间隔 2 秒 } } ``` 在上面的例子中,我们创建了一个Timer对象,然后使用schedule方法来执行任务。在这个例子中,我们让任务在 1 秒后执行,...

    Timer-java.rar_java timer_timer_timer java

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

    java定时器代码

    timer.schedule(task, firstTime, period); // 安排任务 } } ``` **4.1 导入包** 首先,导入了几个必要的包: - `java.util.Calendar`: 提供对日期和时间字段进行操作的方法。 - `java.util.Date`: 表示特定的...

    schedule

    例如,`timer.schedule(TimerTask, 0, 60 * 60 * 1000);`表示每小时执行一次定时任务。 - **监听Web应用生命周期**:通过实现`ServletContextListener`接口并在`contextInitialized`方法中创建并启动定时任务,确保...

    java定时关机源码

    timer.schedule(new ShutdownTimer(), delay); } } ``` 然而,`java.util.Timer`并不是线程安全的,因此在多线程环境中可能会出现问题。为了解决这个问题,Java 5引入了`java.util.concurrent....

    java时间控制代码

    timer.schedule(thisClass, 60 * 1000); // 60秒后执行Test的run方法 try { thisClass.cirStart(); // 开始循环 } catch (InterruptedException e) { e.printStackTrace(); } } private boolean cirFlg = ...

    java定时执行方法&节拍器

    timer.schedule(new TimerTask() { @Override public void run() { System.out.println("定时任务执行了"); } }, 1000, 2000); // 每隔2秒执行一次 } } ``` 然而,`Timer`类存在一些限制,如它不是线程安全...

    java中的定时器,定时访问某程序等

    timer.scheduleAtFixedRate(task, 0, 5000); } } ``` 然而,`Timer`类有一些局限性,如它不是线程安全的,且如果一个任务执行时间过长,可能会影响其他任务的调度。为了解决这些问题,Java 5引入了`java.util....

    java在服务启动的时候启动定时器

    timer.schedule(task, 0, 5000); // 每隔5秒执行一次 } } ``` 在这个例子中,`TimerTask`是一个实现了`run`方法的匿名内部类,代表要执行的任务。`schedule`方法的第二个参数是首次执行的延迟,第三个参数是两次...

    java定时执行代码.

    timer.schedule(new TimerTask() { @Override public void run() { System.out.println("定时任务执行"); } }, 5000); // 延迟5秒执行 } } ``` 使用ScheduledExecutorService的例子: ```java import ...

    Java计时器

    timer.schedule(new TimerTask() { @Override public void run() { System.out.println("Task executed at " + new Date()); } }, 1000, 2000); // 每隔2秒执行一次 } } ``` 在这个例子中,我们创建了一个...

    java,javaweb,spring定时器

    timer.schedule(new TimerTask() { @Override public void run() { System.out.println("定时任务执行"); } }, 1000, 5000); // 每隔5秒执行一次,首次延迟1秒后开始 } } ``` 然而,`java.util.Timer`在处理...

    java 实现调度器

    timer.schedule(new TimerTask() { @Override public void run() { System.out.println("Task executed"); } }, 1000); // 延迟1秒后执行 } } ``` 在这个例子中,`TimerTask`是一个抽象类,我们需要创建它的...

Global site tag (gtag.js) - Google Analytics