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(任务时间,间隔时间)。

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

时间: 2024-08-15 16:04:56

Java中timer的schedule()和schedualAtFixedRate()函数的区别的相关文章

简单理解java中timer的schedule和scheduleAtFixedRate方法的区别

timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有来得及完成下次任务又交到手上. 我们来举个例子: 暑假到了老师给schedule和scheduleAtFixedRate两个同学布置作业. 老师要求学生暑假每天写2页,30天后完成作业. 这两个学生每天按时完成作业,直到第10天,出了意外,两个学生出去旅游花了5天时间,这5天时间里两个人都没有做作业.任务被拖延了. 这时候两个学生采取的策略就不同了: sch

定时任务:Java中Timer和TimerTask的使用

java.util.Timer定时器,实际上是个线程,定时调度所拥有的TimerTasks. 一个TimerTask实际上就是一个拥有run方法的类,需要定时执行的代码放到run方法体内,TimerTask一般是以匿名类的方式创建. 一个完整的Timer: Java代码   java.util.Timer timer = new java.util.Timer(true); // true 说明这个timer以daemon方式运行(优先级低, // 程序结束timer也自动结束),注意,java

java中URL 的编码和解码函数

java中URL 的编码和解码函数java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);在javascript 中URL 的编码和解码函数escape(String s)和unescape(String s) ; 在前台:var url="test.jsp?param="+escape('this%is#te=st&o k?+/');在后台: String param=request.

关于Java中this和super的用法介绍和区别

1.this&super 什么是this,this是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针.当你想要引用当前对象的某种东西,比如当前对象的某个方法,或当前对象的某个成员,你便可以利用this来实现这个目的.要注意的是this只能在类中的非静态方法中使用,静态方法和静态的代码块中绝对不能出现this.his也可作为构造函数来使用.在后面可以看到 而什么是super,可以理解为是指向自己超(父)类对象的一个指针,而这个超类指的是离自己最近的一个父类.super的作用同样是可

深刻理解Java中的String、StringBuffer和StringBuilder的区别

首先简单地来梳理一下Java中String.StringBuffer和StringBuilder各自的含义. 1.String类 首先,它是线程安全的,即可以用于多线程编程中: 其次,String类的对象是不可变的,即在定义时就确定了,类似String str="Hello";str+="Java";的语句其实是生成了新的对象,只是我们未察觉到而已.但是注意在大量的字符串新建对象时消耗就很可观,这时必须考虑采用StringBuffer或StringBuilder,否

java中4种修饰符访问权限的区别及详解全过程

java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为public.protect.default.private,他们这就说明了面向对象的封装性,所以我们要适用他们尽可能的让权限降到最低,从而安全性提高. 下面详细讲述下它们的访问权限问题.(同一个类中除内部类外所有修饰符都是可以访问的,所以下面排除这种情况.) 首先在这里把它们的访问权限表示出来:

java中,return和return null有什么区别吗?

java中,return和return null有什么区别吗? 最大的区别:return;方法的返回值必须是void!return null;方法的返回值必须不是 原始数据类型(封装类除过)和void! return 就是跳出方法...return null也是跳出方法并返回null.. 也就是说return null必须用在返回值不是void的方法里面..return可以用在任何方法里面 不要认为null就是没有值..null就是值..真正的没有值是..比如你String s;这个时候s是没有

Java中集合List,Map和Set的区别

Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Key不能重复 4.Set中的元素是无序的,不可重复的

Java中PhantomReference、WeakReference、SoftReference有什么区别?

Java中有多种引用类型,按照从强到弱的顺序分别如下: 强引用:就是最常见的引用,通过等号赋值就是强引用. 软引用:当内存不足时自动释放引用.一般应用于需要大量内存的缓存程序中. 弱引用:不阻止垃圾回收,当强引用或者软引用都消失时,即使存在弱引用内存也会被释放. 幽灵引用:只引用一个对象的"灵魂",幽灵引用是不能直接访问的,所以get方法永远返回null.这种引用能阻止JVM释放对象的内存,但是被引用的对象可以finalize.这东西有什么用呢?按照文档中的说法就是用于调整对象之间fi