本文主要讨论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. TensorFlow实战12:Bidirectional LSTM Classifier

    https://blog.csdn.net/felaim/article/details/70300362 1.双向递归神经网络简介 双向递归神经网络(Bidirectional Recurrent ...

  2. R 分组计算描述性统计量

    统计学区内各个小区的房价均值 数据格式 id|community_name|house_area|house_structure|house_total|house_avg|agency_name|h ...

  3. Java扫描二维码进行会议签到思路

    1:签到页面都是同一个JSP页面 2:根据不同的会议ID进行拼接URL跳转页面进行签到 JSP页面代码如下 <%@ page language="java" pageEnco ...

  4. Mac关闭摄像头

    为了防止黑客入侵,我们可以手动执行命令,关掉摄像头设备的访问权限,让黑客去看黑夜吧. Mac关闭禁用摄像头的方法,打开终端,拷贝如下代码,回车,输入管理员密码,再次拷贝,回车. sudo chmod ...

  5. Direct2D教程III——几何(Geometry)对象

    目前博客园中成系列的Direct2D的教程有 1.万一的 Direct2D 系列,用的是Delphi 2009 2.zdd的 Direct2D 系列,用的是VS中的C++ 3.本文所在的 Direct ...

  6. vmware目录2

    http://www.globalknowledge.com/training/course.asp?pageid=9&courseid=17880&country=United+St ...

  7. Excel 2007 若干技巧。

    1.自定义序列 office按钮→excel选项→常用→编辑自定义列表 2.无法清空剪贴板错误的处理办法: 取消"显示粘贴选项"选项 3.每次选定同一单元格 输入后按ctrl+En ...

  8. 015-Go 数据库操作注意事项

    1.Query.Exec(1)Exec(update.insert.delete等无结果集返回的操作)调用完后会自动释放连接:(2)Query(返回sql.Rows)则不会释放连接,调用完后仍然占有连 ...

  9. Windows下的Qt Creator的安装

    采用Qt和Qt creator分别下载和安装的方式:(需要手动设置关联Qt和Qt Creator)   一.软件下载 从http://qt-project.org/downloads分别下载Qt和Qt ...

  10. Linux内核配置.config文件

    在命令行中,进入顶层内核目录,并输入命令make menuconfig,就可以启动一个基于菜单的内核配置编辑器.从这里开始,你可以访问每个可用的配置参数,并生成一个定制的内核配置. 当你退出配置编辑器 ...