【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。在实际项目中,根据任务的性质和复杂度,选择合适的定时调度方式是提高系统性能和稳定性的重要因素。

相关推荐
gadiaola14 分钟前
【JVM】Java虚拟机(二)——垃圾回收
java·jvm
крон2 小时前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
zh_xuan3 小时前
c++ 单例模式
开发语言·c++·单例模式
coderSong25683 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
老胖闲聊3 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1183 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
Mr_Air_Boy4 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
曹勖之4 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?4 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏
军训猫猫头5 小时前
96.如何使用C#实现串口发送? C#例子
开发语言·c#