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

相关推荐
handsome_sai4 小时前
【Java 线程池】记录
java
咖啡の猫4 小时前
Python字典推导式
开发语言·python
大学生资源网4 小时前
基于springboot的唐史文化管理系统的设计与实现源码(java毕业设计源码+文档)
java·spring boot·课程设计
leiming65 小时前
C++ vector容器
开发语言·c++·算法
guslegend5 小时前
SpringSecurity源码剖析
java
SystickInt5 小时前
C语言 strcpy和memcpy 异同/区别
c语言·开发语言
CS Beginner5 小时前
【C语言】windows下编译mingw版本的glew库
c语言·开发语言·windows
FJW0208145 小时前
Python_work4
开发语言·python
roman_日积跬步-终至千里5 小时前
【人工智能导论】02-搜索-高级搜索策略探索篇:从约束满足到博弈搜索
java·前端·人工智能
大学生资源网6 小时前
java毕业设计之儿童福利院管理系统的设计与实现(源码+)
java·开发语言·spring boot·mysql·毕业设计·源码·课程设计