java.util.Timer

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      

你可能感兴趣的:(timer)