【Java 基础】32 定时调度

文章目录

    • [Timer 类](#Timer 类)
    • [ScheduledExecutorService 接口](#ScheduledExecutorService 接口)
      • [创建 ScheduledExecutorService](#创建 ScheduledExecutorService)
      • 注意事项
    • 选择合适的定时调度方式
      • [Timer 的适用场景](#Timer 的适用场景)
      • [ScheduledExecutorService 的适用场景](#ScheduledExecutorService 的适用场景)
    • 总结

在软件开发中,定时任务是一种常见的需求,用于周期性地执行特定的任务或操作。Java 提供了两种主要的定时调度方式: Timer 类和 ScheduledExecutorService 接口。

Timer 类

创建 Timer

Timer 类是 Java 提供的一个简单的定时调度工具。它允许您计划一个任务在未来的某个时刻执行,也可以以固定的时间间隔重复执行。

示例代码:

java 复制代码
import java.time.LocalTime;
import java.util.Timer;
import java.util.TimerTask;
public class Demo {
    public static void main(String[] args) {
        Timer timer = new Timer();

        // 创建一个定时任务,延迟 2000 毫秒后开始执行,每隔 5000 毫秒执行一次
        timer.schedule(new TimerTaskDemo(), 2000, 5000);
    }
}

class TimerTaskDemo extends TimerTask {
    @Override
    public void run() {
        System.out.println("执行任务: " + LocalTime.now());
    }
}

输出结果:

注意事项

  • Timer 类在执行任务时是单线程的,如果一个任务的执行时间过长,会影响其他任务的执行。

  • 如果一个任务在执行过程中抛出未捕获的异常,那么 Timer 将终止所有的定时任务。

ScheduledExecutorService 接口

ScheduledExecutorService 是 Java 提供的更强大、灵活的定时调度工具。它基于线程池实现,允许同时执行多个任务,并提供更多的调度选项。

创建 ScheduledExecutorService

示例代码:

java 复制代码
import java.time.LocalTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

public class Demo {
    public static void main(String[] args) {
        ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);

        // 创建一个定时任务,延迟 2 秒后开始执行,每隔 5 秒执行一次
        executorService.scheduleAtFixedRate(
                () -> System.out.println("执行任务: " +  LocalTime.now()),
                2, 5, TimeUnit.SECONDS
        );
    }
}

输出结果:

注意事项

  • ScheduledExecutorService 使用线程池,因此能够更好地处理多个定时任务的并发执行。
  • 它提供了更灵活的调度选项,例如可以设定首次执行的延迟时间,也可以根据上一次任务的执行完成时间来决定下一次任务的开始时间。

选择合适的定时调度方式

Timer 的适用场景

  • 对于简单的定时任务,且任务执行时间短暂的情况,可以选择使用 Timer
  • 适用于单线程执行的场景,不涉及大量的并发任务。

ScheduledExecutorService 的适用场景

  • 适用于复杂的定时任务场景,具有更多的调度选项和更灵活的执行方式。

  • 当需要处理多个定时任务时,ScheduledExecutorService 更适合,因为它基于线程池,能够更好地处理并发任务。

总结

Java 提供了两种主要的定时调度方式:TimerScheduledExecutorService。选择合适的调度方式取决于项目的具体需求。对于简单的定时任务,Timer 可以满足需求。而对于更复杂、更灵活的场景,以及需要处理多个定时任务的情况,推荐使用 ScheduledExecutorService。在实际项目中,根据任务的性质和复杂度,选择合适的定时调度方式是提高系统性能和稳定性的重要因素。

相关推荐
LXS_3572 分钟前
C++常用容器(下)---stack、queue、list、set、map
开发语言·c++·学习方法·改行学it
愚者游世5 分钟前
list Initialization各版本异同
开发语言·c++·学习·程序人生·算法
Poetinthedusk14 分钟前
WPF应用跟随桌面切换
开发语言·wpf
shejizuopin18 分钟前
基于SSM的高校旧书交易系统的设计与实现(任务书)
java·mysql·毕业设计·论文·任务书·基于ssm的·高校旧书交易系统的设计与实现
Hello World . .19 分钟前
数据结构:二叉树(Binary tree)
c语言·开发语言·数据结构·vim
叫我辉哥e121 分钟前
新手进阶Python:办公看板升级交互式可视化+移动端适配+多终端同步
开发语言·python
1candobetter26 分钟前
JAVA后端开发——Spring Boot 组件化自动配置机制
java·开发语言·spring boot
码农小卡拉29 分钟前
MyBatis-Flex 全面解析与实战教程:轻量高效的 MyBatis 增强方案
java·mybatis
没有bug.的程序员29 分钟前
Spring Boot 与 Sleuth:分布式链路追踪的集成、原理与线上故障排查实战
java·spring boot·分布式·后端·分布式链路追踪·sleuth·线上故障排查
一个网络学徒30 分钟前
python练习3
开发语言·python