原文作者:一叶丿清风

原文地址:schedule方法和scheduleAtFixedRate方法的区别

schedule方法和scheduleAtFixedRate方法都可以实现任务的延时和不延时执行且都会按顺序执行,因此不需要考虑非线程安全的情况。它们的主要区别只在于有没有追赶特性。具体如下:

  1. 任务执行未超时, 下次执行时间=上次执行开始时间+period;
  2. 任务执行超时, 下次执行时间=上次执行结束时间;

举个例子:暑假到了老师给schedule和scheduleAtFixedRate两个同学布置作业。老师要求学生暑假每天写2页,30天后完成作业。这两个学生每天按时完成作业,直到第10天,出了意外,两个学生出去旅游花了5天时间,这5天时间里两个人都没有做作业。任务被拖延了。这时候两个学生采取的策略就不同了:schedule重新安排了任务时间,旅游回来的第一天做第11天的任务,第二天做第12天的任务,最后完成任务花了35天。scheduleAtFixedRate是个守时的学生,她总想按时完成老师的任务,于是在旅游回来的第一天把之前5天欠下的任务以及第16天当天的任务全部完成了,之后还是按照老师的原安排完成作业,最后完成任务花了30天。(不一定是第一天就完成之前5天的任务,因任务执行时间而定,但会连续执行任务,不间隔,直到赶上之前时间节点的任务安排为止.)

下面以实示例演示什么是追赶特性。

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class Test {public static void main(String[] args) throws InterruptedException {MyTask myTask = new MyTask();System.out.println("现在执行时间为:" + new Date());Calendar c = Calendar.getInstance();c.set(Calendar.SECOND, c.get(Calendar.SECOND) - 20);Date runDate = c.getTime();System.out.println("计划执行时间为:" + runDate);Timer timer = new Timer();//调用的是schedule方法,验证其不具追赶性timer.schedule(myTask, runDate, 4000);}
}class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("begin timer=" + new Date());System.out.println("end timer=" + new Date());}}

部分运行结果如图 5-1所示

图 5-1 不追赶 

时间“Fri Aug 11 19:43:47 CST 2017”到“Fri Aug 11 19:44:07 CST 2017”之间的时间所对应的Task任务就被取消掉,不被执行了,这就是Task任务不追赶。

验证scheduleAtFixedRate方法具有追赶执行性:

import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class Test {public static void main(String[] args) throws InterruptedException {MyTask myTask = new MyTask();System.out.println("现在执行时间为:" + new Date());Calendar c = Calendar.getInstance();c.set(Calendar.SECOND, c.get(Calendar.SECOND) - 20);Date runDate = c.getTime();System.out.println("计划执行时间为:" + runDate);Timer timer = new Timer();//调用scheduleAtFixedRate方法,测试其具有追赶性timer.scheduleAtFixedRate(myTask, runDate, 4000);}
}class MyTask extends TimerTask {@Overridepublic void run() {System.out.println("begin timer=" + new Date());System.out.println("end timer=" + new Date());}}

部分运行结果如图 5-2 所示:

图 5-2 追赶

将两个时间段内所对应的Task任务被“补充性”地执行,这就是Task任务追赶特性。

Java并发编程—schedule方法和scheduleAtFixedRate方法的区别相关推荐

  1. java——Scanner中nextLine()方法和next()方法的区别

    遇到一个有意思的东西,在整理字符串这块知识的时候,发现我在用Scanner函数时,在字符串中加入空格,结果空格后面的东西没有输出来(/尴尬),不多说直接上代码: import java.util.Sc ...

  2. Java类型转换中valueOf方法和parseInt方法的区别

    在Java的类型转换中,我们经常会使用valueOf或者parseInt(parseFloat/parseDouble等)来转换.这二者有什么区别呢?我们看如下的代码: String inputVal ...

  3. flush方法和close方法的区别

    package com.learn.Demo05Writer;import java.io.FileWriter; import java.io.IOException;/*flush方法和close ...

  4. dispose方法和setvisible方法的区别和使用

    dispose方法和setvisible方法的区别: dispose()撤销当前窗口,并释放当前窗口所使用的资源. setVisible()方法仅仅隐藏窗体,可设置窗口是否可见,窗口默认是不可见的. ...

  5. 请简述一下线程的sleep()方法和yield()方法的区别?

    请简述一下线程的sleep()方法和yield()方法的区别? ①sleep()方法给其他线程机会时不考虑线程的优先级,因此会给低优先级的线程以运行的机会. yield()方法只会给相同优先级或更高优 ...

  6. ExtJS中listener方法和handler方法的区别

    listener方法和handler方法的区别在文档中的说明的太玄乎了,看不懂 listeners监听能够对一个click Event事件添加任意多个的事件响应处理函数 而handler处理只能够通过 ...

  7. python predict_对Keras中predict()方法和predict_classes()方法的区别说明

    1 predict()方法 当使用predict()方法进行预测时,返回值是数值,表示样本属于每一个类别的概率,我们可以使用numpy.argmax()方法找到样本以最大概率所属的类别作为样本的预测标 ...

  8. get方法和post方法的区别及常用的请求方式

    get方法和post方法的区别: get方法是从服务器上获取资源:post方法是向服务器传送数据: get方法参数是通过url传递的,post方法是放在request body中:GET比POST更不 ...

  9. 普歌-码灵团队-java中的equals方法和toString方法及总结

    普歌-码灵团队:Object类中的方法介绍及其用法 一.Object类 二.方法介绍 1.toString方法 2.重写equals方法: 3. 拓展 三.总结 一.Object类的简单介绍 二.Ob ...

最新文章

  1. android实现多画面播放,可无缝切换小窗/全屏的android播放器实现
  2. 电子信息工程水声考研去向_哈工大电子与信息工程专业考研 科研方向汇总
  3. 【Spark机器学习速成宝典】模型篇01支持向量机【SVM】(Python版)
  4. Python入门100题 | 第028题
  5. pro mvvm 读书笔记
  6. ps流 转发_RTP协议全解析(H264码流和PS流)(转)
  7. DC / OS中具有Java和数据库应用程序的服务发现
  8. MacOS 如何安装 SVN 命令终端
  9. expect详解及自动登录脚本的实现
  10. python整形魔法_python 魔法方法
  11. 微软认证及课程简写含义
  12. [18]Debian Linux Install GNU GCC Compiler and Development Environment
  13. php 编译原理,编译原理
  14. 如何手工配置DBControl
  15. 如何使用并解释通过 vSAN 监测收集的性能统计信息 (2064240)
  16. Python3爬虫入门之pyquery库的使用
  17. swiper.js插件的使用
  18. 软件界面是怎么做出来的_可可英语这个软件怎么样?了解的人出来说说真实情况...
  19. 中国橡胶防老剂4020市场现状与投资预测报告(2022版)
  20. 如何用计算机设置闹铃,在win10系统下怎样设置电脑闹钟铃声?

热门文章

  1. 垂直居中重要方法理解---重点是方法三
  2. DHTML4(select与checkbox应用)
  3. lamp兄弟连视频笔记
  4. java 自定义一个容器类
  5. Android 自定义注解(Annotation)
  6. 【uoj#139】[UER #4]被删除的黑白树 贪心
  7. 升级jquery-easyui1.4.5后treegrid无法显示
  8. HDU 3932 模拟退火
  9. Session对象的集合
  10. 排序1+1:冒泡排序法(BubbleSort)的改进以及效率比较