根据两种情况来看区别

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

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. element-ui 动态换肤

    1.在安装好 element-ui@2.x 以后,首先安装sass-loader npm i sass-loader node-sass -D 2.安装 element-theme npm i ele ...

  2. 机器学习之决策树三-CART原理与代码实现

    决策树系列三—CART原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/9482885.html ID ...

  3. 使用IO流写文件的一些骚操作

    序言 当需要对文件进行操作时,使用IO流是不能避免的操作:比如业务中需要存储一些请求的响应结果中的一些内容.当所需处理的文件过大时,如果频繁的关闭文件流,会造成很大的开销,何时关闭?往往会造成比较大的 ...

  4. QLineEdit拾遗:数据的过滤、验证和补全

    QLineEdit是使用频率最高的控件之一,当我们想获取用户输入时自然而然得会用到它. 通常我们会将QLineEdit的信号或其他控件的信号绑定至槽函数,然后获取并处理编辑器内的数据.你会觉得我们拿到 ...

  5. aspx中的checkbox 取值问题

    问题:前台checkbox控件,选中值为1,不选值为0: 解决方案: 插入一行 <input type="hidden" name="RemberPwd" ...

  6. Less与TypeScript的简单理解与应用,并使用WebPack打包静态页面

    既然选择了远方,便只顾风雨兼程 __ HANS许 系列:零基础搭建前后端分离项目 系列:零基础搭建前后端分离项目 创建空项目 使用Less 使用TypeScript 使用WebPack 开始写项目 总 ...

  7. CDN的简单理解

    百度百科上的解释:CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调 ...

  8. AFO && OI回忆录

    技不如人,甘拜下风 今天是2019.4.6,联考第一天,菜鸡attack原题爆炸(其实是都不会)心灰意冷(其实并没有很难过)写下了这篇文章 T1 2h写个跟\(k\)无关的假算法写到最后发现是三个lo ...

  9. 基于GitLab的Code Review教程

    一.前言 1.本文主要内容 GitLab Code Review机制说明 Git Workflow 与 Git Code Review Workflow GitLab Code Review 配置说明 ...

  10. 利用ZYNQ SOC快速打开算法验证通路(6)——LWIP实现千兆TCP/IP网络传输

    一.前言 之前ZYNQ与PC之间的网络连接依赖于外接硬件协议栈芯片,虽然C驱动非常简单,但网络带宽受限.现采用LWIP+PS端MAC控制器+PHY芯片的通用架构.关于LWIP库,已经有很多现成的资料和 ...