一、使用

相同点

任务执行未超时,则下次执行时间 = 上次执行开始时间 + period任务执行超时,则下次执行时间 = 上次执行结束时间

不同点

schedule在错过以后会按照自己的节奏继续走,可能会导致丢失任务,但时间间隔稳定。scheduleAtFixedRate在错过后,会努力追赶进度,以确保保持执行频率的稳定。

代码示例

我们进行一个简单的测试,在下面的代码中,每3秒就会有一个间隔5秒的线程休眠(模拟超时),对比一下二者输出数据的区别。

package com;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;public class TimerTest {public static void main(String[] args) {// 任务此时已经启动Timer t = new Timer();TimerTask task = new CustomTimerTask("test");// 添加任务/** schedule 保持间隔时间的稳定* scheduleAtFixedRate 保持执行频率的稳定*/t.schedule(task, new Date(), 2000);
//        t.scheduleAtFixedRate(task, new Date(), 2000);}
}class CustomTimerTask extends TimerTask {private String name;int count = 1;private final SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");public CustomTimerTask(String name) {this.name = name;}@Overridepublic void run() {try {System.out.println("线程 : " + count);System.out.println("startTime = " + dateFormatter.format(new Date()));if (count % 3 == 0) {Thread.sleep(5000);}count++;System.out.println("endTime = " + dateFormatter.format(new Date()) + "\r\n");} catch (InterruptedException e) {e.printStackTrace();}}
}

输出数据对比

schedule

线程 : 1
startTime = 2023-02-25 10:20:28
endTime = 2023-02-25 10:20:28线程 : 2
startTime = 2023-02-25 10:20:30
endTime = 2023-02-25 10:20:30线程 : 3
startTime = 2023-02-25 10:20:32
endTime = 2023-02-25 10:20:37线程 : 4
startTime = 2023-02-25 10:20:37
endTime = 2023-02-25 10:20:37线程 : 5
startTime = 2023-02-25 10:20:39
endTime = 2023-02-25 10:20:39线程 : 6
startTime = 2023-02-25 10:20:41
endTime = 2023-02-25 10:20:46线程 : 7
startTime = 2023-02-25 10:20:46
endTime = 2023-02-25 10:20:46线程 : 8
startTime = 2023-02-25 10:20:48
endTime = 2023-02-25 10:20:48线程 : 9
startTime = 2023-02-25 10:20:50
endTime = 2023-02-25 10:20:55线程 : 10
startTime = 2023-02-25 10:20:55
endTime = 2023-02-25 10:20:55线程 : 11
startTime = 2023-02-25 10:20:57
endTime = 2023-02-25 10:20:57

可以看到,schedule在线程4的位置,它的开始时间是上一个线程的结束时间,它有在努力追赶,但后续并没有把之前落下的线程补回来。

scheduleAtFixedRate

线程 : 1
startTime = 2023-02-25 10:18:59
endTime = 2023-02-25 10:18:59线程 : 2
startTime = 2023-02-25 10:19:01
endTime = 2023-02-25 10:19:01线程 : 3
startTime = 2023-02-25 10:19:03
endTime = 2023-02-25 10:19:08线程 : 4
startTime = 2023-02-25 10:19:08
endTime = 2023-02-25 10:19:08线程 : 5
startTime = 2023-02-25 10:19:08
endTime = 2023-02-25 10:19:08线程 : 6
startTime = 2023-02-25 10:19:09
endTime = 2023-02-25 10:19:14线程 : 7
startTime = 2023-02-25 10:19:14
endTime = 2023-02-25 10:19:14线程 : 8
startTime = 2023-02-25 10:19:14
endTime = 2023-02-25 10:19:14线程 : 9
startTime = 2023-02-25 10:19:15
endTime = 2023-02-25 10:19:20线程 : 10
startTime = 2023-02-25 10:19:20
endTime = 2023-02-25 10:19:20线程 : 11
startTime = 2023-02-25 10:19:20
endTime = 2023-02-25 10:19:20

同样是线程4的位置,它的开始时间是上一个线程的结束时间,并且在其后还有一个线程5,说明scheduleAtFixedRate还是在很努力地加油想把之前落下的线程补回来的。

Java定时任务schedule和scheduleAtFixedRate的异同相关推荐

  1. java定时任务TimerTask与scheduleAtFixedRate

    TimerTask 使用demo,当任务的执行时间大于period time(周期时间)的时候,会发现,两次任务之间的间隔时间其实是任务的执行时间,period time并没有生效.(类似单线程被阻塞 ...

  2. Java定时任务之--schedule与scheduleAtFixedRate异同

    相同点: 任务执行未超时,下次执行时间 = 上次执行开始时间 + period:任务执行超时,下次执行时间 = 上次执行结束时间:在任务执行未超时时,它们都是上次执行时间加上间隔时间,来执行下一次任务 ...

  3. java实现定时任务 Schedule

    1.java定时任务可以借助 java.util.Timer 来实现 [java] view plaincopy import java.util.Calendar; import java.util ...

  4. java中timer类包_Java~util包中Timer的使用, 演示cancel方法 和 对比schedule和scheduleAtFixedRate方法...

    Timer Timer类的主要作用就是设置计划任务,但封装任务的类却是TimerTask类 执行计划任务的代码要放人TimerTask的子类中,因为TimerTask是一个抽象类.而且要重写其run方 ...

  5. java实现定时任务 schedule_详解java定时任务

    在我们编程过程中如果需要执行一些简单的定时任务,无须做复杂的控制,我们可以考虑使用JDK中的Timer定时任务来实现.下面LZ就其原理.实例以及Timer缺陷三个方面来解析java Timer定时器. ...

  6. JAVA定时任务的简单实现

    Java定时任务的简单实现 2011-01-02 18:34:43|  分类: 软件开发 |  标签:void  timer  import  param  dateutil   |字号大中小 订阅 ...

  7. Java定时任务技术分析

    <从零打造项目>系列文章 工具 比MyBatis Generator更强大的代码生成器 ORM框架选型 SpringBoot项目基础设施搭建 SpringBoot集成Mybatis项目实操 ...

  8. Java 定时任务详解

    文章目录 单机定时任务技术选型 Timer ScheduledExecutorService Spring Task 时间轮 分布式定时任务技术选型 Quartz Elastic-Job XXL-JO ...

  9. Java定时任务(2)

    Java定时任务(2) 上次浅显的分析了Timer及TimerTask的调度原理,这里我们再来看一下另一种定时调度方式ScheduledThreadPoolExecutor的内部执行原理. Sched ...

最新文章

  1. 发布:IE自动打印插件
  2. 8086地址传送指令LDS,LES
  3. 链表实现c语言通讯录管理系统,C++链表实现通讯录管理系统.pdf
  4. 电大计算机应用模块四实2010,国家开放大学《计算机应用基础》考试与答案形考任务模块2Word2010文字处理系统—客观题测验答案.docx...
  5. java 编码与基础数据类型
  6. MySQL之架构与历史(二)
  7. windows下Call to undefined function curl_init() error问题
  8. 【Elasticsearch】 海量 分词器 在线地址 与文档
  9. Mongo 3.6.1版本Sharding集群配置
  10. 【推导】【DFS】Codeforces Round #429 (Div. 1) B. Leha and another game about graph
  11. EDA技术实用教程 | 复习十二 | 序列检测器
  12. linux fcntl函数,Linux C 学习之 - fcntl 函数
  13. Java初学者项目考核–小说管理系统
  14. putty设置xming
  15. pip:Could not fetch URL ***: There was a problem confirming the ssl certificate: HTTPSConnectionPool
  16. vue table表格中身份证隐藏中间几位
  17. win10上不了网服务器未响应,win10的DNS 服务器未响应
  18. 【AIOT】Python语音处理
  19. CSS | 使一个元素高度由图片撑开
  20. 科技SCI论文正体斜体规定

热门文章

  1. 计算机启动慢是什么原因是什么情况,电脑启动慢是什么原因
  2. 图像灰度化的三种方式
  3. 如何处理emoji等4字节的Unicode字符 - utf8mb4 vs. utf8 Collations
  4. 设计模式-迭代器模式
  5. 三级信息安全技术 知识点总结
  6. 没有Iphone也能装逼:让Android版QQ显示成Iphone6
  7. 计算机专业 845,2021年浙江工商大学硕士研究生自命题845计算机基础综合考研大纲...
  8. 红旗Linux桌面操作系统V11社区预览版虚拟机安装
  9. Go语言中sort.Search()的使用方法(数组中通过值来取索引)
  10. 初学Substance Painter:最基本的工作流程