本文主要讨论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()函数的区别的更多相关文章

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

    timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有来得及完成下次任务又交到手上. 我们来举个例子: 暑假到了老 ...

  2. java中URL 的编码和解码函数

    java中URL 的编码和解码函数java.net.URLEncoder.encode(String s)和java.net.URLDecoder.decode(String s);在javascri ...

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

    java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...

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

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

  5. Java中的“==操作符”和equals方法有什么区别

    Java中的"=="和equals方法究竟有什么区别? 1.==操作符 "=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的 ...

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

    java中,return和return null有什么区别吗? 最大的区别:return;方法的返回值必须是void!return null;方法的返回值必须不是 原始数据类型(封装类除过)和void ...

  7. Java中关键字continue、break和return的区别

    Java中关键字continue.break和return的区别: continue:跳出本次循环继续下一次循环 break:   跳出循环体,继续执行循环外的函数体 return:   跳出整个函数 ...

  8. Java中Compareable和Comparator两种比较器的区别

    Java中Compareable和Comparator两种比较器的区别 参考原文链接:https://www.cnblogs.com/ldy-blogs/p/8488138.html 1.引言 在ja ...

  9. java中的NIO和IO到底是什么区别?20个问题告诉你答案

    摘要:NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多. 本文分享自华为云社区<jav ...

随机推荐

  1. JQuery实现密码有短暂的显示过程和实现 input hint效果

    目录: 一.实现目的 二.问题思考 三.解决办法 1.输入用户名 2.输入密码短暂显示 一.实现目的 这几天做项目的时候,客户要求在文本框输入密码的时候,要求密码有短暂的显示过程,如下图: 二.问题思 ...

  2. redis调优 -- 内存碎片

    最近查看了一下redis运行状况,发现公司测试服务器的redis内存不太够用,但是实际占用内存的数据量其实不大,以前也没有这种情况,之前在cache层新增了一个防刷积分任务的逻辑才会这样,搜索一下原因 ...

  3. CSS命名规范和规则

    一.命名规则 ).尽量不缩写,除非一看就明白的单词 二.class的命名 (1).red { color: red; } .f60 {color: #f60; } .ff8600{ color: #f ...

  4. lstm(一) 演化之路

    递归神经网络引入了时序的反馈机制,在语音.音乐等时序信号的分析上有重要的意义. Hochreiter(应该是Schmidhuber的弟子)在1991年分析了bptt带来的梯度爆炸和消失问题,给学习算法 ...

  5. Window.sessionStorage

      The sessionStorage property allows you to access a session Storage object for the current origin. ...

  6. .Net 如何实现 LINQ~

    本文内容 引入 实现 LINQ 的两个前提 扩展方法 λ 表达式 LINQ 参考资料 本文说明 LINQ 是如何实现的,知道这点,才能更好地使用它~ 如果你刚接触 LINQ,那么可能不会那么快就理解. ...

  7. Android 八款开源 Android 游戏引擎

    原文地址 本文内容 Angle Rokon LGame AndEngine libgdx jPCT Alien3d Catcake 最近无意间看到一篇关于 Android 搜索引擎的文章,于是搜索了, ...

  8. tomcat中的日志开关文件(logging.properties)介绍

    以tomcat-6.0.29为例: http://www.ossez.com/thread-18138-1-1.html #配置tomcat的日志输出方式,这里表示文件输出和控制台输出.handler ...

  9. 报错信息:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path

    用Eclipse创建jsp页面时,提示这个错误 解决的方法是:右键项目,Build Path->Configure Build Path Add Library Server Runtime,这 ...

  10. Git客户端安装

    Git介绍 分布式 : Git版本控制系统是一个分布式的系统, 是用来保存工程源代码历史状态的命令行工具; 保存点 : Git的保存点可以追踪源码中的文件, 并能得到某一个时间点上的整个工程项目额状态 ...