scheduleAtFixedRate

每间隔一段时间执行,分为两种情况:

  1. 当前任务执行时间小于间隔时间,每次到点即执行;

    /**
    * 任务执行时间(8s)小于间隔时间(10s)
    */
    public class ScheduleTest {
    static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public static void main(String[] args) {
    scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
    System.out.println("Start: scheduleAtFixedRate: " + new Date());
    try {
    Thread.sleep(8000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("End : scheduleAtFixedRate: " + new Date());
    }
    }, 0, 10 , SECONDS);
    }
    } output: Start: scheduleAtFixedRate: Sun Apr 28 14:36:00 CST 2019
    End : scheduleAtFixedRate: Sun Apr 28 14:36:08 CST 2019
    Start: scheduleAtFixedRate: Sun Apr 28 14:36:10 CST 2019
    End : scheduleAtFixedRate: Sun Apr 28 14:36:18 CST 2019
    Start: scheduleAtFixedRate: Sun Apr 28 14:36:20 CST 2019
    End : scheduleAtFixedRate: Sun Apr 28 14:36:28 CST 2019
    Start: scheduleAtFixedRate: Sun Apr 28 14:36:30 CST 2019
    End : scheduleAtFixedRate: Sun Apr 28 14:36:38 CST 2019
    ... 程序启动时间是14:36:00,以后每间隔10s执行一次(即14:36:10、14:36:20、14:36:30等)。
  2. 当前任务执行时间大于等于间隔时间,任务执行后立即执行下一次任务。相当于连续执行了。

    /**
    * 任务执行时间(12s)大于间隔时间(10s)
    */
    public class ScheduleTest {
    static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public static void main(String[] args) {
    scheduler.scheduleAtFixedRate(new Runnable() {
    @Override
    public void run() {
    System.out.println("Start: scheduleAtFixedRate: " + new Date());
    try {
    Thread.sleep(12000);
    } catch (InterruptedException e) {
    e.printStackTrace();
    }
    System.out.println("End : scheduleAtFixedRate: " + new Date());
    }
    }, 0, 10 , SECONDS);
    }
    } output: Start: scheduleAtFixedRate: Sun Apr 28 14:30:13 CST 2019
    End : scheduleAtFixedRate: Sun Apr 28 14:30:25 CST 2019
    Start: scheduleAtFixedRate: Sun Apr 28 14:30:25 CST 2019
    End : scheduleAtFixedRate: Sun Apr 28 14:30:37 CST 2019
    Start: scheduleAtFixedRate: Sun Apr 28 14:30:37 CST 2019
    End : scheduleAtFixedRate: Sun Apr 28 14:30:49 CST 2019
    Start: scheduleAtFixedRate: Sun Apr 28 14:30:49 CST 2019
    End : scheduleAtFixedRate: Sun Apr 28 14:31:01 CST 2019 程序启动时间是14:30:13,按理说应该每间隔10s执行一次(即14:30:23、14:30:33等),但由于任务执行时间长于10s,下一次的任务要开始的时候发现上次的任务还没有完成,因此阻塞等待,一旦发现上次的任务完成,就马上启动。表现出来就是任务延时启动,最终的效果就是连续执行。

scheduleWithFixedDelay

每当上次任务执行完毕后,间隔一段时间执行。不管当前任务执行时间大于、等于还是小于间隔时间,执行效果都是一样的。

/**
* 任务执行时间(8s)小于间隔时间(10s)
*/
public class ScheduleTest {
static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public static void main(String[] args) {
scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("Start: scheduleWithFixedDelay: " + new Date());
try {
Thread.sleep(12000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End : scheduleWithFixedDelay: " + new Date());
}
}, 0, 10 , SECONDS);
}
} output: Start: scheduleWithFixedDelay: Sun Apr 28 14:27:59 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:28:07 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:28:17 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:28:25 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:28:35 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:28:43 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:28:53 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:29:01 CST 2019
... 可以看出每个End后,等待了10秒,才启动下一次Start。
/**
* 任务执行时间(12s)大于间隔时间(10s)
*/
public class ScheduleTest {
static ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public static void main(String[] args) {
scheduler.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
System.out.println("Start: scheduleWithFixedDelay: " + new Date());
try {
Thread.sleep(12000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("End : scheduleWithFixedDelay: " + new Date());
}
}, 0, 10 , SECONDS);
}
} output: Start: scheduleWithFixedDelay: Sun Apr 28 14:26:29 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:26:41 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:26:51 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:27:03 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:27:13 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:27:25 CST 2019
Start: scheduleWithFixedDelay: Sun Apr 28 14:27:35 CST 2019
End : scheduleWithFixedDelay: Sun Apr 28 14:27:47 CST 2019
... 可以看出每个End后,等待了10秒,才启动下一次Start。

参考

scheduleAtFixedRate vs scheduleWithFixedDelay

扩展

Spring定时任务@Scheduled注解使用方式浅窥(cron表达式、fixedRate和fixedDelay)

理解ScheduledExecutorService中scheduleAtFixedRate和scheduleWithFixedDelay的区别的更多相关文章

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

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

  2. scheduleAtFixedRate 与 scheduleWithFixedDelay 的区别

    总结: scheduleAtFixedRate ,是以上一个任务开始的时间计时,period时间过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完 ...

  3. 深入理解css3中nth-child和 nth-of-type的区别

    在css3中有两个新的选择器可以选择父元素下对应的子元素,一个是:nth-child 另一个是:nth-of-type. 但是它们到底有什么区别呢? 其实区别很简单::nth-of-type为什么要叫 ...

  4. 深入理解css3中 nth-child 和 nth-of-type 的区别

    在css3中有两个新的选择器可以选择父元素下对应的子元素,一个是:nth-child 另一个是:nth-of-type. 但是它们到底有什么区别呢? 其实区别很简单::nth-of-type为什么要叫 ...

  5. ScheduledThreadPoolExecutor线程池scheduleAtFixedRate和scheduleWithFixedDelay的区别

    ScheduledFuture<?> result = executor.scheduleAtFixedRate(task,2, 5, TimeUnit.SECONDS); 在延迟2秒之后 ...

  6. IOS基础:深入理解Objective-c中@class 和#import的区别

    在面向对象objective-C语言中,当一个类使用到另一个类时,并且在类的头文件中需要创建被引用的指针时,可以#import方式引入,通过@class引入: 这两种的方式的区别在于: 1.运用#im ...

  7. 理解js中__proto__和prototype的区别和关系

    首先,要明确几个点:1.在JS里,万物皆对象.方法(Function)是对象,方法的原型(Function.prototype)是对象.因此,它们都会具有对象共有的特点.即:对象具有属性__proto ...

  8. 【转】为什么我们都理解错了HTTP中GET与POST的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  9. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

随机推荐

  1. 由ping所引发的思考~

    今天看了掘金一片关于ping原理的文章,https://juejin.im/entry/5af8d5e651882565bd25581c?utm_source=gold_browser_extensi ...

  2. C Primer Plus 第6章 C控制语句:循环 编程练习

    记录下写的最后几题. 14. #include <stdio.h> int main() { double value[8]; double value2[8]; int index; f ...

  3. Mybatis夺标关联查询一对多实例

    <?xml version="1.0" encoding="UTF-8" ?>  <!DOCTYPE mapper PUBLIC " ...

  4. mac下的readelf和objdump

    ELF文件包括: (1)可重定位的目标文件 (2)可执行的目标文件 (3)可被共享的目标文件 可以用file命令来看目标文件是否是ELF文件 在linux下,用readelf来看ELF头部或者其它各s ...

  5. Codeforces Round #483 (Div. 2)

    题目链接: https://cn.vjudge.net/contest/229761 A题: n个数字,两个人轮流去数字,直到剩下最后一个数字为止,第一个人希望剩下的数字最小,第二个人希望数字最大,最 ...

  6. windows下使用 Secure Shell Client工具操作linux常用命令

    如果项目部署在linux系统上,而我们使用的是windows系统,那我们可以使用Secure Shell软件进行操作,那怎么使用它来操作tomcat呢? 1.  cd /usr/share/apach ...

  7. 25个让Java程序员更高效的Eclipse插件

    Eclipse提供了一个可扩展插件的开发系统.这就使得Eclipse在运行系统之上可以实现各种功能.这些插件也不同于其他的应用(插件的功能是最难用代码实现的).拥有合适的Eclipse插件是非常重要的 ...

  8. python一键刷屏

    #当按键q的时候,自动输入 "大家好!"并回车键发送! from pynput import keyboard from pynput.keyboard import Key, C ...

  9. Java 读书笔记 (一) 基本知识

    1. 基本概念 对象 对象是类的一个实例,有状态和行为. 例如,一条狗是一个对象,它的状态有:颜色.名字.品种:行为有: 摇尾.叫.吃等. 类 类是一个模板,它描述一类对象的行为和状态. 方法 方法就 ...

  10. index.go

    package types type DocumentIndex struct {     // 文本的DocId     DocId uint64     // 文本的关键词长     TokenL ...