ScheduledThreadPoolExecutor 中ScheduleAtFixedRate 和 ScheduleWithFixedDelay方法讲解

java 中ScheduledExecutorService接口是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。

大家好,又见面了,我是全栈君。

java 中ScheduledExecutorService接口是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。
其中的一个实现类是ScheduledThreadPoolExecutor,ScheduledThreadPoolExecutor的uml类图关系如下:

这里写图片描述

(1)>ScheduledThreadPoolExecutor实现ScheduledExecutorService接口,实现了一些定时任务处理的方法。

(2)>ScheduledThreadPoolExecutor继承了ThreadPoolExecutor,可以通过线程池进行任务的管理和调度。

下面介绍ScheduledThreadPoolExecutor中实现ScheduledExecutorService接口最常用的调度的两个方法ScheduleAtFixedRate 和 ScheduleWithFixedDelay。

一、scheduleAtFixedRate方法
1:方法简介

scheduleAtFixedRate(Runnable command,
                                long initialDelay,
                                  long period,
                                  TimeUnit unit)

上面的四个参数进行讲解:
第一个command参数是任务实例,
第二个initialDelay参数是初始化延迟时间,
第三个period参数是间隔时间,
第四个unit参数是时间单元。

2:代码实例
(1):当任务实例commod执行的时间小于间隔时间period情况

public class TestExecutor { 
   

    private static  ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);

    public static void main(String[] args) {


    }

    /** * 进行scheduleAtFixedRate测试 */
    public static void testFixedRate(){
        executor.scheduleAtFixedRate(new myRun(), 5, 5, TimeUnit.SECONDS);
    }


    static class myRun implements Runnable{

        @Override
        public void run() {
            System.out.println("----测试开始--------"+ new Date().toLocaleString());
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("---休眠3秒后, 处理结束--------"+new Date().toLocaleString());
        }
    }


}

运行结果:

----测试开始--------2017-10-11 11:38:38 #第一次执行 ---休眠3秒后, 处理结束--------2017-10-11 11:38:41 #第一次任务处理,花费3秒  #第二次执行时间是第一次时间 + period 即38 + 5 = 43;
----测试开始--------2017-10-11 11:38:43 ---休眠3秒后, 处理结束--------2017-10-11 11:38:46 ----测试开始--------2017-10-11 11:38:48 ---休眠3秒后, 处理结束--------2017-10-11 11:38:51 ----测试开始--------2017-10-11 11:38:53

(2):当任务实例commod执行的时间大于间隔时间period情况
修改 Thread.sleep(3000); 为 Thread.sleep(6000);,执行查看运行结果!

运行结果:

----测试开始--------2017-10-11 11:41:22 #第一次执行时间 ---休眠3秒后, 处理结束--------2017-10-11 11:41:28 # 任务处理6秒,即 22+6 = 28 #第二次执行时间 == 上一次处理结束时间,因为任务处理时间大于period间隔时间
----测试开始--------2017-10-11 11:41:28 ---休眠3秒后, 处理结束--------2017-10-11 11:41:34 ----测试开始--------2017-10-11 11:41:34

3:总结
ScheduleAtFixedRate 每次执行时间为上一次任务开始起向后推一个时间间隔。分为两种情况:
(1)若command执行的时间小于period若每次执行时间为 :initialDelay, initialDelay+period, initialDelay+2*period, …;

(2)若command执行的时间大于period,则command执行完,下一次任务将立即执行!下即下一次任务不会按照预期的时间间隔执行,每次执行时间为 :initialDelay, initialDelay+taskExecutorTIme, initialDelay+2*taskExecutorTIme, …;

taskExecutorTIme为任务执行的时间!

二、scheduleWithFixedDelay

1:方法简介

scheduleWithFixedDelay(Runnable command,
                                                     long initialDelay,
                                                     long delay,
                                                     TimeUnit unit

上面的四个参数进行讲解:
第一个command参数是任务实例,
第二个initialDelay参数是初始换延迟时间,
第三个delay参数是延迟间隔时间,
第四个unit参数是时间单元

2:代码实例

(1):当任务实例commod执行的时间小于延迟间隔时间delay情况

public class TestExecutor { 
   

    private static  ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1);

    public static void main(String[] args) {
        testFixedDelay();

    }




    public static void testFixedDelay(){
        executor.scheduleWithFixedDelay(new myRun(), 5, 5, TimeUnit.SECONDS);
    }


    static class myRun implements Runnable{ 
   

        @Override
        public void run() {
            System.out.println("----测试开始--------"+ new Date().toLocaleString());
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("---休眠3秒后, 处理结束--------"+new Date().toLocaleString());
        }
    }


}

运行结果:

----测试开始--------2017-10-11 11:59:02 #第一次执行时间 ---休眠3秒后, 处理结束--------2017-10-11 11:59:05 #任务处理的时间,3秒 #第二次执行的时间 == 第一次任务开始时间+任务处理时间+delay延迟时间
#即 10 == 02 + 3秒 +  5秒 
----测试开始--------2017-10-11 11:59:10 ---休眠3秒后, 处理结束--------2017-10-11 11:59:13 ----测试开始--------2017-10-11 11:59:18 ---休眠3秒后, 处理结束--------2017-10-11 11:59:21 ....

(2):当任务实例commod执行的时间大于延迟间隔时间delay情况
将Thread.sleep(3000); 修改为 Thread.sleep(6000);
运行结果:

----测试开始--------2017-10-11 12:02:48 #第一次任务执行开始时间 ---休眠6秒后, 处理结束--------2017-10-11 12:02:54 #任务处理的时间 ,6秒 #第二次任务执行开始时间 == 第一次任务执行开始时间 + 任务处理的时间 + delay延迟时间
#即 59 == 48 + 6 + 5 
----测试开始--------2017-10-11 12:02:59 ---休眠6秒后, 处理结束--------2017-10-11 12:03:05 ----测试开始--------2017-10-11 12:03:10 ......

3:总结
不管任务command执行的时间是多长,下一次任务的执行时间都是上一次任务执行完后在等待延迟间隔delay时间后执行下一次任务。
ScheduleWithFixedDelay 每次执行时间为上一次任务结束起向后推一个时间间隔,即每次执行时间为:initialDelay, initialDelay+executeTime+delay, initialDelay+2*executeTime+2*delay。

三、参考
https://www.ibm.com/developerworks/cn/java/j-lo-taskschedule/



如果帅气(美丽)、睿智(聪颖),和我一样简单善良的你看到本篇博文中存在问题,请指出,我虚心接受你让我成长的批评,谢谢阅读!
祝你今天开心愉快!


欢迎访问我的csdn博客,我们一同成长!

不管做什么,只要坚持下去就会看到不一样!在路上,不卑不亢!

博客首页http://blog.csdn.net/u010648555

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/121135.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 归一化方法总结_实例归一化

    归一化方法总结_实例归一化参考自:http://blog.csdn.net/zbc1090549839/article/details/44103801http://blog.csdn.net/junmuzi/article/details/48917361归一化方法(NormalizationMethod)1。把数变为(0,1)之间的小数主要是为了数据处理方便提出来的,把数据映

    2022年10月11日
    2
  • .bat批处理基础

    .bat批处理基础批处理(Batch),也称为批处理脚本。顾名思义,批处理就是对某对象进行批量的处理,通常被认为是一种简化的脚本语言,它应用于DOS和Windows系统中。批处理文件的扩展名为bat。目前比较常见的批

    2022年7月3日
    25
  • 一些常用的yum安装卸载的命令

    一些常用的yum安装卸载的命令

    2021年5月31日
    137
  • TFS 使用心得–权限管理

    TFS 使用心得–权限管理最近一段时间负责管理公司技术人员的 TFS 的权限分配 在此之前 我对 tfs 一点都不了解 没用过 也没听朋友用过 只在进公司时指导我的组长帮我把这个工具装上 告知要在上面报 bug 即 bug 管理在上面 之后的很长一段时间就只知道 tfs 可以管理 bug 可以管理文档 可以管理源代码 这点是从我负责测试的那个项目下的文件夹中看到的 至于怎么来管理 其中有多复杂 没有太多的了解 指导两个月前 接手 tfs 权限管理工作以来 才知道里面有多复杂 经理只告诉我怎么分配项目成员的项目权限 其他的都不知道 起初还以为这样

    2025年10月12日
    3
  • ODBC学习笔记—SQLAllocHandle

    ODBC学习笔记—SQLAllocHandleSQLAllocHandle函数定义:顾名思义,该函数就是用来分配句柄的,句柄类型参考参数详解。SQLRETURNSQLAllocHandle(     SQLSMALLINT     HandleType,     SQLHANDLE     InputHandle,     SQLHANDLE*     OutputHandlePtr);参数详解:Handl

    2022年7月14日
    18
  • 马赛克还原神器—Depix,真的有那么神吗?「建议收藏」

    马赛克还原神器—Depix,真的有那么神吗?「建议收藏」Depix是用于从马赛克中还原密码/英文数字组合的Python工具。它的官方效果是这样的:效果非常令人惊艳,恢复后基本和原文图相差无几。但是真的有那么神吗?老规矩,需要打包好的软件关注小编,QQ群:721195303领取。01怎么做到的?第一步,作者在编辑器中使用了与原图(带有马赛克的图片)相同的字体设置(文本大小,字体,颜色等设置),然后将debruinseq.txt内的文字和数字放入编辑器中并截图,这张截图中的所有文字都将被像素化后作为“搜索集”来识别原图中马赛克的真实..

    2022年6月23日
    93

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号