根据两种情况来看区别

一.首次计划执行的时间早于当前的时间

1.schedule方法

  “fixed-delay”:如果第一次执行时间被延迟了,随后的执行时间按照上一次实际执行完成的时间点进行计算

演示:

public class DifferenceTest {
public static void main(String[] args) {
//规定时间格式
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取当前的具体时间
Calendar calendar = Calendar.getInstance();
System.out.println("Current time is:" + sf.format(calendar.getTime()));
//设置成6秒前的时间,若当前时间为2019-04-22 15:44:50
//那么设置之后的时间变成2019-04-22 15:44:44
calendar.add(Calendar.SECOND, -6);
Timer timer = new Timer();
//第一次执行时间为6秒前,之后每隔两秒钟执行一次
timer.schedule(new TimerTask() { @Override
public void run() {
// 打印当前的计划执行时间
System.out.println("Scheduled exec time is:" +
sf.format(scheduledExecutionTime()));
System.out.println("Task is being executed!");
}
}, calendar.getTime(),2000); }
}

执行效果:

2.scheduleAtFixedRate方法

  “fixed-rate”;如果第一次执行时间被延迟了,随后的执行时间按照上一次开始的时间点进行计算,

并且为了赶上进度会多次执行任务,因此TimerTask中的执行体需要考虑同步。

演示:

public class DifferenceTest {
public static void main(String[] args) {
//规定时间格式
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取当前的具体时间
Calendar calendar = Calendar.getInstance();
System.out.println("Current time is:" + sf.format(calendar.getTime()));
//设置成6秒前的时间,若当前时间为2019-04-22 15:44:50
//那么设置之后的时间变成2019-04-22 15:44:44
calendar.add(Calendar.SECOND, -6);
Timer timer = new Timer();
//第一次执行时间为6秒前,之后每隔两秒钟执行一次
timer.scheduleAtFixedRate(new TimerTask() { @Override
public void run() {
// 打印当前的计划执行时间
System.out.println("Scheduled exec time is:" +
sf.format(scheduledExecutionTime()));
System.out.println("Task is being executed!");
}
}, calendar.getTime(),2000); }
}

执行效果如下:

如图,因为设置了每隔2s执行一次,第一次执行时间比当前时间提早了6s,所以它会从原定最早的时间,先直接执行三次,来追上现在的进度。


二.任务执行时间超出执行周期间隔

1.schedule方法

  下一次执行时间相对于上一次实际执行完成的时间点,因此执行时间会不断延后。

演示:

public class DifferenceTest {
public static void main(String[] args) {
//规定时间格式
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取当前的具体时间
Calendar calendar = Calendar.getInstance();
System.out.println("Current time is:" + sf.format(calendar.getTime()));
Timer timer = new Timer();
//第一次执行时间为6秒前,之后每隔两秒钟执行一次
timer.schedule(new TimerTask() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 打印当前的计划执行时间
System.out.println("Scheduled exec time is:" +
sf.format(scheduledExecutionTime()));
System.out.println("Task executes!");
}
}, calendar.getTime(),2000);
}
}

执行结果:

用sleep,模拟执行任务时间为三秒,大于任务间隔时间。

2.scheduleAtFixedRate方法

  下一次执行时间相对于上一次开始的时间点,因此执行时间一般不会延后,因此存在并发性。

演示:

public class DifferenceTest {
public static void main(String[] args) {
//规定时间格式
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//获取当前的具体时间
Calendar calendar = Calendar.getInstance();
System.out.println("Current time is:" + sf.format(calendar.getTime()));
Timer timer = new Timer();
//第一次执行时间为6秒前,之后每隔两秒钟执行一次
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// 打印当前的计划执行时间
System.out.println("Scheduled exec time is:" +
sf.format(scheduledExecutionTime()));
System.out.println("Task executes!");
}
}, calendar.getTime(),2000);
}
}

执行结果如下:

不会被任务执行所需要时间影响。

定时任务调度工作(学习记录 四)schedule与scheduleAtFixedRate的区别的更多相关文章

  1. leveldb 学习记录(四)Log文件

    前文记录 leveldb 学习记录(一) skiplistleveldb 学习记录(二) Sliceleveldb 学习记录(三) MemTable 与 Immutable Memtablelevel ...

  2. JavaScript学习记录四

    title: JavaScript学习记录四 toc: true date: 2018-09-16 20:31:22 --<JavaScript高级程序设计(第2版)>学习笔记 要多查阅M ...

  3. 4.VUE前端框架学习记录四:Vue组件化编码2

    VUE前端框架学习记录四:Vue组件化编码2文字信息没办法描述清楚,主要看编码Demo里面,有附带完整的代码下载地址,有需要的同学到脑图里面自取.脑图地址http://naotu.baidu.com/ ...

  4. leveldb 学习记录(四) skiplist补与变长数字

    在leveldb 学习记录(一) skiplist 已经将skiplist的插入 查找等操作流程用图示说明 这里在介绍 下skiplist的代码 里面有几个模块 template<typenam ...

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

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

  6. 定时任务调度工作(学习记录 二)timer定时函数的用法

    schedule的四种用法: 1.schedule(task,time) 参数: task----所安排的任务 time----执行任务的时间 作用: 在时间等于或超过time的时候执行且仅执行一次t ...

  7. 定时任务调度工作(学习记录 三)timer其他重要函数

    TimerTask的两个重要函数: 1.cancel() 作用: 取消当前TimerTask里的任务 演示: 先在继承了TimerTask的类中添加一个计时器,然后在run方法中合适的位置添加canc ...

  8. Linux 学习记录 四(Bash 和 Shell scirpt)

    一.什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,因为图形接口其实也可以操作各种驱动程序来呼叫核心进行工 ...

  9. Linux 学习记录 四(Bash 和 Shell scirpt).

    一.什么是 Shell? 狭义的shell指的是指令列方面的软件,包括基本的Linux操作窗口Bash等,广义的shell则包括 图形接口的软件,因为图形接口其实也可以操作各种驱动程序来呼叫核心进行工 ...

随机推荐

  1. offset系列,client系列,scroll系列回顾

    一 scroll系列属性      ——滚动

  2. 一个用来爬小说的简单的Node.js爬虫

    小说就准备点天下霸唱和南派三叔的系列,本人喜欢看,而且数据也好爬.貌似因为树大招风的原因,这两作者的的书被盗版的很多,乱改的也多.然后作者就直接在网上开放免费阅读了,还提供了官网,猜想作者应该是允许爬 ...

  3. dubbo不完全指南

    Dubbo架构 节点角色说明 节点 角色说明 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方 Registry 服务注册与发现的注册中心 Monitor 统计服务的 ...

  4. Java多线程知识整理

    多线程 1. 多线程基础 多线程状态转换图 普通方法介绍 yeild yeild,线程让步.是当前线程执行完后所有线程又统一回到同一起跑线.让自己或者其他线程运行,并不是单纯的让给其他线程. join ...

  5. Java 平台无关性的基石

    Java 在刚刚诞生之初就提出过一个非常著名的口号:"一次编写,到处运行", 这句话充分表达了软件开发人员对冲破平台界限的渴望 在竞争激烈的 IT 领域,各种不同的硬件体系结构和不 ...

  6. 浏览器的同源策略及CORS跨域解决方案 DRF

    一个源的定义 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同源检测的示例: UR ...

  7. Windows有点腻了?不如试试Ubuntu.

    最近在接触Python. 因为担心环境会向Java一样,很容易影响当前的工作电脑. 所以准备搭建一台虚拟机,不过Windows的尺寸是在太大了.所以,选择安装Ubuntu. Ubuntu官方网站地址: ...

  8. 给萌新的Flexbox简易入门教程

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 原文出处:https://www.sitepoint.com/flexbox-css-flexible-bo ...

  9. HBase单机模式部署

    1.上传&解压 2.设置环境变量 3.启用&检验 4.编辑hbase-env.sh 5.编辑hbase-site.xml 6.启动hbase 7.验证 8.启动hbase shell

  10. C# 匿名对象(匿名类型)、var、动态类型 dynamic——实用之:过滤类属性、字段实用dynamic

    例子 返回一个LIst<oject>类型 而oject含有 30个字段 而我只需要两个字段.这里实用dynamic 和 linq. 上代码: 注意select new {} 为匿名类型,这 ...