• Java中timer的schedule()和schedualAtFixedRate()函数的区别


    本文主要讨论java.util.Timer的schedule(timerTask,delay,period)和scheduleAtFixedRate(timerTask,delay,period)的区别。

    这两个函数不管是哪一个,TImer都是单线程的,任务始终在这个单线程里面执行。

    下面讨论四种情况:
    [(任务3s,间隔2s)+(任务2s,间隔3s)]×[schedule+scheduleAtFixedRate]

    schedule,任务3s,间隔2s

        new Timer().schedule(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " " + scheduledExecutionTime() / 1000 + " " + System.currentTimeMillis() / 1000);
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 2000);
    
    
    输出为
    Timer-0 1519651551 1519651551
    Timer-0 1519651554 1519651554
    Timer-0 1519651557 1519651557
    

    schedule,任务2s,间隔3s

    把上面代码中的Thread.sleep()改为2s,把interval改为3s

    Timer-0 1519651602 1519651602
    Timer-0 1519651605 1519651605
    Timer-0 1519651608 1519651608
    

    scheduleAtFixedRate,任务3s,间隔2s

        new Timer().scheduleAtFixedRate(new TimerTask() {
            @Override
            public void run() {
                System.out.println(Thread.currentThread().getName() + " " + scheduledExecutionTime() / 1000 + " " + System.currentTimeMillis() / 1000);
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 0, 2000);
    
    输出为
    Timer-0 1519651707 1519651707
    Timer-0 1519651709 1519651710
    Timer-0 1519651711 1519651713
    Timer-0 1519651713 1519651716
    

    scheduleAtFixedRate,任务2s,间隔3s

    Timer-0 1519651750 1519651750
    Timer-0 1519651753 1519651753
    Timer-0 1519651756 1519651756
    

    总结

    下面定义四个名称:

    • timer.scheduledExecutionTime()为理论时间间隔
    • System.currentMilliSeconds()为实际时间间隔
    • schedule(task,delay,interval)和scheduleAtFixedRate(task,delay,interval)中的interval参数为设定时间间隔
    • 任务时间:执行任务所花费的时间

    schedule()运行时,理论时间间隔总是等于实际时间间隔,此时间间隔为max(任务时间,设定时间间隔)
    scheduleAtFixedRate()运行时,理论时间间隔总是等于设定的时间间隔,实际时间间隔总是等于max(任务时间,间隔时间)。

  • 相关阅读:
    JAVA内存管理
    计算机网络面试题一
    计算机网络面试题二
    【有容云干货-容器系列】补脑专用,容器生态圈脑图大放送
    PPT | Docker定义存储-让应用无痛运行
    有容云-容器安全,六招解决
    新IT运维时代 | Docker运维之最佳实践-下篇
    新IT运维时代 | Docker运维之最佳实践-上篇
    有容云-【原理】Docker存储驱动之AUFS
    【有容云案例系列】基于Jenkins和Kubernetes的CI工作流
  • 原文地址:https://www.cnblogs.com/weiyinfu/p/8476180.html
Copyright © 2020-2023  润新知