Timer类中的 scheduleAtFixedRate与schedule

Timer类中的 scheduleAtFixedRate与scheduleTimer 是 jdk 中提供的一个定时器工具 使用的时候会在主线程之外起一个单独的线程执行指定的计划任务 可以指定执行一次或者反复执行多次 定义了主要有以下 6 个方法 顾名思义 schedule 与 scheduleAtFi 的区别就是 是否按固定速率执行安排指定的任务 一般情况下 timer 的 schedule 和 scheduleAtFi 方法没有区别 只在某个情况出

Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。定义了主要有以下6个方法:

Timer类中的 scheduleAtFixedRate与schedule

顾名思义,schedule与scheduleAtFixedRate 的区别就是——是否按固定速率执行安排指定的任务。

一般情况下,timer的schedule和scheduleAtFixedRate方法没有区别,只在某个情况出现时会有区别–当前任务没有来得及完成下次任务又交到手上。


蓝色星辰 https://www.cnblogs.com/snailmanlilin/p/6873802.html 在这里举个例子:

暑假到了老师给schedule和scheduleAtFixedRate两个同学布置作业。

老师要求学生暑假每天写2页,30天后完成作业。

这两个学生每天按时完成作业,直到第10天,出了意外,两个学生出去旅游花了5天时间,这5天时间里两个人都没有做作业。任务被拖延了。

这时候两个学生采取的策略就不同了:

schedule重新安排了任务时间,旅游回来的第一天做第11天的任务,第二天做第12天的任务,最后完成任务花了35天。

scheduleAtFixedRate是个守时的学生,她总想按时完成老师的任务,于是在旅游回来的第一天把之前5天欠下的任务以及第16天当天的任务全部完成了,之后还是按照老师的原安排完成作业,最后完成任务花了30天。


Ling912 对schedule和scheduleAtFixedRate的区别做了具体阐述:https://blog.csdn.net/ling/article/details/

在这里我主要学习了其中的Timer.scheduleAtFixedRate()方法。

import java.util.Timer; import java.util.TimerTask; TimerTask task = new TimerTask() { @Override public void run() { //自定义 } }; public void scheduleAtFixedRate(TimerTask task,long delay,long period) public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)

参数

  • task–这是被调度的任务。其中TimerTask是一个实现了run方法的一个类,而具体的TimerTask需要自定义
  • firstTime–这是首次在该任务将被执行。
  • delay–这是以毫秒为单位的延迟之前的任务执行。
  • period– 这是在连续执行任务之间的毫秒的时间。

具体代码实现内容为:

public void schedule(TimerTask task, long delay, long period)

 这个方法是调度一个task,在delay(ms)后开始调度,每次调度完后,最少等待period(ms)后才开始调度。


public void scheduleAtFixedRate(TimerTask task, long delay, long period)

        调度一个task,在delay(ms)后开始调度,然后每经过period(ms)再次调度。这一句描述是和schedule是一样的,但是具体内容不然。

        schedule在计算下一次执行的时间的时候,是通过当前时间(在任务执行前得到) + 时间片,而scheduleAtFixedRate方法是通过当前需要执行的时间(也就是计算出现在应该执行的时间)+ 时间片。前者是运行的实际时间,而后者是理论时间点,

        例如:schedule时间片是5s,那么理论上会在5、10、15、20这些时间片被调度,但是如果由于某些CPU征用导致未被调度,假如等到第8s才被第一次调度,那么schedule方法计算出来的下一次时间应该是第13s而不是第10s,这样有可能下次就越到20s后而被少调度一次或多次。

         scheduleAtFixedRate方法就是每次理论计算出下一次需要调度的时间用以排序,若第8s被调度,那么计算出应该是第10s,所以它距离当前时间是2s,那么再调度队列排序中,会被优先调度,那么就尽量减少漏掉调度的情况。


和上一个schedule方法类似,唯一的区别就是传入的第二个参数为第一次调度的时间。

public void schedule(TimerTask task, Date firstTime, long period)

public void scheduleAtFixedRate(TimerTask task, Date firstTime,long period)

       和上一个scheduleAtFixedRate方法类似,唯一的区别就是第一次调度时间设置为一个Date时间,而不是当前时间的一个时间片。

 

参考文献:

一个很厉害的作者!!

https://www.cnblogs.com/0201zcr/p/4703061.html

 

 

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

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

(0)
上一篇 2026年3月17日 下午1:44
下一篇 2026年3月17日 下午1:44


相关推荐

  • 圆柱体积怎么算立方公式_圆柱体积计算公式 怎么计算

    圆柱体积怎么算立方公式_圆柱体积计算公式 怎么计算各位家长好,我是家长无忧(jiazhang51.cn)专栏作者,七玥老师全文共计767字,建议阅读2分钟圆柱体是由2个底边和一个侧边构成的。在同一个平面图内有一条定平行线和一条功能分区,当这一平面图绕着这条定平行线转动一周时,这条功能分区所成的面称为转动面,这条定平行线称为转动面的轴,这条功能分区称为转动面的母线槽。圆柱体的界定1、旋转定义法:一个长方形以一边为轴顺时针方向或反方向转动一周,所历经…

    2026年1月29日
    5
  • keytool问题

    keytool问题1 bash keytool commandnotfo nbsp nbsp nbsp nbsp nbsp 应该是没有把 java 的路径加到 path 里 要先打以下命令 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp exportPATH usr java jdk1 6 0 45 bin PATH nbsp nbsp nbsp nbsp nbsp 然后就可以了 不过这个是暂时的 如果终端关闭 下次就要重新再打 nbsp 2 不同版本的 Java 自带的 keytool

    2026年3月17日
    2
  • c#(asp.net)杂谈笔记

    c#(asp.net)杂谈笔记

    2021年6月20日
    98
  • 电脑登陆出现此工作站和主域间的信任关系失败[通俗易懂]

    电脑登陆出现此工作站和主域间的信任关系失败[通俗易懂]问题如下:具体操作步骤可参考https://jingyan.baidu.com/article/37bce2be193fd51003f3a259.htm

    2022年10月18日
    5
  • idea2021激活码(破解版激活)

    idea2021激活码(破解版激活),https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月17日
    105
  • format(format c)

    a-antemeridiemandpostmeridiemd-dayofmonth(noleadingzero)dd-dayofmonth(twodigit)o-dayofyear(noleadingzeros)oo-dayofyear(threedigit)D-daynameshortDD-…

    2022年4月10日
    51

发表回复

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

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