Timer与TimerTask的真正原理&使用介绍

https://blog.csdn.net/xieyuooo/article/details/8607220

 

Timer是一种定时器工具,用来在一个后台线程计划执行指定任务。它可以计划执行一个任务一次或反复多次。

TimerTask一个抽象类,它的子类代表一个可以被Timer计划的任务

Timer timer = new Timer();
timer.schedule(new TimerTask() {
        public void run() {
            System.out.println("abc");
        }
}, 200000 , 1000);

这个方法是调度一个task,经过delay(ms)后开始进行调度,仅仅调度一次。

public void schedule(TimerTask task, long delay)

在指定的时间点time上调度一次。

public void schedule(TimerTask task, Date time)

这个方法是调度一个task,在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调度。

public void schedule(TimerTask task, long delay, long period)

和上一个方法类似,唯一的区别就是传入的第二个参数为第一次调度的时间。

public void schedule(TimerTask task, Date firstTime, long period)
public void scheduleAtFixedRate(TimerTask task, long delay, long period)

调度一个task,在delay(ms)后开始调度,然后每经过period(ms)再次调度,貌似和方法:schedule是一样的,其实不然

  • schedule:保证调度间隔是period ,如果某一次调度时间比较长,那么后面的时间会顺延,保证调度间隔都是period,
  • scheduleAtFixedRate:保证每次调度是在(最初算出来的)预定时间,可以调整时间间隔period——而scheduleAtFixedRate是严格按照调度时间来的,如果某次调度时间太长了,那么会通过缩短间隔的方式保证下一次调度在预定时间执行。

举个栗子:你每个3秒调度一次,那么正常就是0,3,6,9s这样的时间,如果第二次调度多花了2s的时间,如果是schedule,就会变成0,3+2,8,11这样的时间,保证间隔,而scheduleAtFixedRate就会变成0,3+2,6,9,压缩间隔,保证调度时间。

方法同上,唯一的区别就是第一次调度时间设置为一个Date时间,而不是当前时间的一个时间片,我们在源码中会详细说明这些内容。

public void scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
原文地址:https://www.cnblogs.com/wxdlut/p/14948536.html