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)
  • 相关阅读:
    pgspider sqlite mysql docker 镜像
    pgspider docker 镜像
    pgspider基于pg 的高性能数据可视化sql 集群引擎
    diesel rust orm 框架试用
    golang 条件编译
    Performance Profiling Zeebe
    bazel 学习一 简单java 项目运行
    一个好用node http keeplive agnet
    gox 简单灵活的golang 跨平台编译工具
    mailhog 作为smtp server mock工具
  • 原文地址:https://www.cnblogs.com/wxdlut/p/14948536.html
Copyright © 2011-2022 走看看