Java定时任务schedule和scheduleAtFixedRate的异同

 更新时间:2023年05月11日 15:01:32   作者:赵昕彧  
本文主要介绍了Java定时任务schedule和scheduleAtFixedRate的异同,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

一、使用

相同点

  • 任务执行未超时,则下次执行时间 = 上次执行开始时间 + 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;
    }
    @Override
    public 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的异同的文章就介绍到这了,更多相关Java schedule scheduleAtFixedRate内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java构建菜单树的实现示例

    Java构建菜单树的实现示例

    本文主要介绍了Java构建菜单树的实现示例,像一级菜单,二级菜单,三级菜单甚至更多层级的菜单,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-05-05
  • @Controller、@RestController注解区别详解

    @Controller、@RestController注解区别详解

    这篇文章主要介绍了@Controller、@RestController注解区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • SpringBoot单元测试没有执行的按钮问题及解决

    SpringBoot单元测试没有执行的按钮问题及解决

    这篇文章主要介绍了SpringBoot单元测试没有执行的按钮问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01
  • Java 中导入excel时使用 trim() 无法去除空格的问题解决方案

    Java 中导入excel时使用 trim() 无法去除空格的问题解决方案

    这篇文章主要介绍了Java中导入excel时使用trim()无法去除空格的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-06-06
  • 云计算实验:Java MapReduce编程

    云计算实验:Java MapReduce编程

    这篇文章主要介绍了云计算实验:Java MapReduce编程, 居于Java围绕MapReduce编程展开详细内容,文章助大家掌握MapReduce编程,理解MapReduce原理,需要的朋友可以参考一下
    2021-12-12
  • 轻松掌握Java状态模式

    轻松掌握Java状态模式

    这篇文章主要帮助大家轻松掌握Java状态模式,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • Spring Cloud服务安全连接方式

    Spring Cloud服务安全连接方式

    这篇文章主要介绍了Spring Cloud服务安全连接方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • Java面试题冲刺第二十五天--并发编程3

    Java面试题冲刺第二十五天--并发编程3

    这篇文章主要为大家分享了最有价值的三道关于并发编程的面试题,涵盖内容全面,包括数据结构和算法相关的题目、经典面试编程题等,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • 通过Java实现添加或删除PDF中的附件

    通过Java实现添加或删除PDF中的附件

    当我们在制作PDF文件或者PPT演示文稿的时候,为了让自己的文件更全面详细,就会在文件中添加附件。本文为大家整理了Java实现添加或删除PDF中的附件的方法,需要的可以参考下
    2023-01-01
  • 基于Feign传输对象无法接收参数的问题

    基于Feign传输对象无法接收参数的问题

    这篇文章主要介绍了基于Feign传输对象无法接收参数的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03

最新评论