zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    原 java调整数据顺序是奇数位于偶数的前面(思路与实现)
    队列和栈是什么,列出它们的区别?
    python 虚拟环境创建
    系统架构知识
    Git 管理代码
    继承类构造方法使用
    if __name__=="__main__"
    django 项目创建
    python unittest的使用
    python ddt/paramunittest的使用
  • 原文地址:https://www.cnblogs.com/wxdlut/p/14948536.html
Copyright © 2011-2022 走看看