在java中,Timer类主要用于 定时性、周期性任务的触发,这个类中有两个方法比较难理解,那就是schedule和scheduleAtFixedRate方法,在这里就用实例分析一下

(1)schedule方法:“fixed-delay”;如果第一次执行时间被delay了,随后的执行时间 按照 上一次 实际执行完成的时间点进行计算
(2)scheduleAtFixedRate方法:“fixed-rate”;如果第一次执行时间被delay了,随后的执行时间 按照 上一次开始的 时间点进行计算,并且为了”catch up”会多次执行任务,TimerTask中的执行体 需要考虑同步

[c-sharp] view plaincopy
  1. SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  2. Date startDate = dateFormatter.parse("2010/11/26 00:20:00");
  3. Timer timer = new Timer();
  4. timer.scheduleAtFixedRate(new TimerTask(){
  5. public void run()
  6. {
  7. System.out.println("execute task!" + this.scheduledExecutionTime());
  8. }
  9. },startDate,3*60*1000);

以上的代码,表示在2010-11-26 00:20:00秒开始执行,每3分钟执行一次
假设在2010/11/26 00:27:00执行
以上会打印出3次
execute task!   00:20
execute task!   00:23    catch up
execute task!   00:26    catch up
下一次执行时间是00:29,相对于00:26
当换成schedule方法时,在2010/11/26 00:27:00执行
会打印出1次
execute task!   00:20   无catch up
下一次执行时间为00:30,相对于00:27

以上考虑的都是在你设定的timer开始时间后,程序才被执行

当执行任务的时间大于周期间隔时,会发生什么呢?
(1)schedule方法:下一次执行时间相对于 上一次 实际执行完成的时间点 ,因此执行时间会不断延后
(2)scheduleAtFixedRate方法:下一次执行时间相对于 上一次开始的 时间点,因此执行时间不会延后, 存在并发性
以下例程序来测试上述结论,TimerTask需要执行6秒钟,但是间隔周期为5秒钟

[java] view plaincopy
  1. package test;
  2. import java.text.ParseException;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5. import java.util.Timer;
  6. import java.util.TimerTask;
  7. public class Test {
  8. public static void main(String[] args) throws ParseException {
  9. SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
  10. Date startDate = dateFormatter.parse("2010/11/28 01:06:00");
  11. Timer timer = new Timer();
  12. timer.schedule(new TimerTask(){
  13. public void run() {
  14. try {
  15. Thread.sleep(6000);
  16. } catch (InterruptedException e) {
  17. e.printStackTrace();
  18. }
  19. System.out.println("execute task!"+ this.scheduledExecutionTime());
  20. }
  21. },startDate, 5 * 1000);
  22. }
  23. }

schedule方法的执行结果如下:
execute task!1290877560001
execute task!1290877566001
execute task!1290877572001
execute task!1290877578001
execute task!1290877584001
execute task!1290877590001
execute task!1290877596001
execute task!1290877602001
execute task!1290877608001
execute task!1290877614001
execute task!1290877620001
execute task!1290877626001
execute task!1290877632001
execute task!1290877638001
可以看出,间隔时间都为6秒,因此, 下一次的执行时间点=上一次程序执行完成的时间点+间隔时间
当换成scheduleAtFixedRate方法的执行结果如下:
execute task!1290877860000
execute task!1290877865000
execute task!1290877870000
execute task!1290877875000
execute task!1290877880000
execute task!1290877885000
execute task!1290877890000
execute task!1290877895000
execute task!1290877900000
execute task!1290877905000
execute task!1290877910000
execute task!1290877915000
execute task!1290877920000
execute task!1290877925000
execute task!1290877930000
可以看出,间隔时间都为5秒,因此, 下一次的执行时间点=上一次程序开始执行的时间点+间隔时间;并且因为前一个任务要执行6秒,而当前任务已经开始执行了,因此两个任务间存在重叠,需要考虑线程同步

Timer的schedule和scheduleAtFixedRate方法的区别解析相关推荐

  1. Timer的schedule和scheduleAtFixedRate方法的区别解析(转)

    在java中,Timer类主要用于定时性.周期性任务 的触发,这个类中有两个方法比较难理解,那就是schedule和scheduleAtFixedRate方法,在这里就用实例分析一下 (1)sched ...

  2. Java并发编程—schedule方法和scheduleAtFixedRate方法的区别

    原文作者:一叶丿清风 原文地址:schedule方法和scheduleAtFixedRate方法的区别 schedule方法和scheduleAtFixedRate方法都可以实现任务的延时和不延时执行 ...

  3. java中timer类包_Java~util包中Timer的使用, 演示cancel方法 和 对比schedule和scheduleAtFixedRate方法...

    Timer Timer类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类 执行计划任务的代码要放人TimerTask的子类中,因为TimerTask是一个抽象类.而且要重写其run方 ...

  4. Timer的schedule和scheduleAtFixedRate区别

    Timer的schedule和scheduleAtFixedRate个人理解. schedule的下次开始时间是根据结束时间来看的,你设置一个间隔2秒的任务,但是每个任务需要执行的时间需要5秒,他会判 ...

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

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

  6. LocalBroadcastManager 与 Context 的 registerReceiver / sendBroadcast / unregisterReceiver 方法的区别解析

    文章目录 英文原贴 中文释义 英文原贴 Q: I was using Context.registerReceiver(), Context.sendBroadcast(Intent), and Co ...

  7. Timer类中的 scheduleAtFixedRate与schedule

    Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次.定义了主要有以下6个方法: 顾名思义,schedule与sche ...

  8. schedule() 和 scheduleAtFixedRate() 的区别--转载

    1.  schedule() ,2个参数方法: 在执行任务时,如果指定的计划执行时间scheduledExecutionTime <= systemCurrentTime,则task会被立即执行 ...

  9. ScheduledExecutorService中scheduleAtFixedRate方法与scheduleWithFixedDelay方法的区别

    ScheduledExecutorService中scheduleAtFixedRate方法与scheduleWithFixedDelay方法的区别 ScheduledThreadPoolExecut ...

最新文章

  1. 在线作图|微生物多样性分析——物种累计曲线
  2. kotlin的Delegates与lateinit对比
  3. c++,static 静态成员变量 / 静态成员函数
  4. Java IO: FileInputStream
  5. 46-单元测试(1)
  6. Jenkins 2.322 安装 自定义插件
  7. JavaScript 的 Date 方法的使用
  8. c++多线程结束后需要释放_缓刑结束后是否需要继续坐牢?
  9. dw二级联动下拉菜单插件 宋君墨_Excel实例——一级、二级、多级下拉菜单一次讲透...
  10. android 多线程 js,android中的jstack,见见线程都在干嘛
  11. u-boot 设置mac 地址
  12. mysql怎么跨库查询_在MySQL中怎样进行跨库查询?
  13. ImportError: /home/cyj/anaconda2/bin/../lib/libstdc++.so.6: version `GLIBCXX_3.4.21' not found
  14. 数据分析:你的城市复工了吗?
  15. 单片机-bmp280大气压强与温度传感器使用详解
  16. Silverlight 教程第五部分:用 ListBox 和 DataBinding 显示列表数据 (木野狐译)
  17. EPICS -- 测试asynDriver和设备支持的示例1-- 连接测试
  18. node.js 安装步骤(超详细小白版) 和 node安装指定版本
  19. 算法:最长公共子序列(输出所有最长公共子序列)
  20. Ubuntu18.04 中的文件管理器

热门文章

  1. Mysql+innodb数据存储逻辑
  2. VNC轻松连接远程Linux桌面
  3. 《APUE》中的函数整理
  4. 在Fedora8上安装MySQL5.0.45的过程
  5. 找到一个不错的ASP.net电子图书下载网站
  6. Redhat7.4安装Oracle11g详细步骤
  7. 高通fastmmi(ffbm)的使用
  8. WINCE6.0显示驱动模型介绍
  9. 【知识点】Java常用类库
  10. Caused by: java.lang.ClassNotFoundException: org.objectweb.asm.Type