码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2018-02-26 23:17:26      阅读:531      评论:0      收藏:0      [点我收藏+]

标签:scheduled   函数   pre   时间间隔   task   span   rri   参数   代码   

本文主要讨论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中timer的schedule()和schedualAtFixedRate()函数的区别

标签:scheduled   函数   pre   时间间隔   task   span   rri   参数   代码   

原文地址:https://www.cnblogs.com/weidiao/p/8476180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!