JAVA中ScheduledExecutorService的使用方法

ScheduledExecutorService 简介

  • ScheduledExecutorService是 Java 中的一个接口,它是ExecutorService的子接口。它主要用于在给定的延迟之后或周期性地执行任务。这个接口提供了一种方便的方式来处理异步任务的调度,相比于传统的TimerTimerTask,它具有更好的灵活性和可靠性,特别是在处理多线程环境下的任务调度时。
  • 它在java.util.concurrent包中,是 Java 并发编程的重要组成部分。通过ScheduledExecutorService,可以有效地管理和调度多个异步任务,这些任务可以是一次性执行的,也可以是周期性重复执行的。

常用方法

schedule

schedule(Runnable command, long delay, TimeUnit unit)

  • 功能描述 :该方法用于安排一个任务(Runnable)在指定的延迟(delay)之后执行一次。TimeUnit是一个枚举类型,用于指定延迟的时间单位,例如TimeUnit.SECONDS表示秒,TimeUnit.MILLISECONDS表示毫秒等。
  • 示例代码
java 复制代码
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        Runnable task = () -> System.out.println("任务在延迟后执行");
        scheduler.schedule(task, 5, TimeUnit.SECONDS);
        scheduler.shutdown();
  • 解释 :在这个示例中,首先通过Executors.newScheduledThreadPool(1)创建了一个ScheduledExecutorService对象,线程池大小为 1。然后定义了一个Runnable任务,该任务只是简单地打印一条消息。接着使用schedule方法安排这个任务在 5 秒(TimeUnit.SECONDS)后执行。最后调用shutdown方法来优雅地关闭ScheduledExecutorService,防止资源泄漏。

scheduleAtFixedRate

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)

  • 功能描述 :用于安排一个任务在初始延迟(initialDelay)之后开始执行,然后以固定的频率(period)重复执行。如果任务的执行时间超过了指定的周期(period),下一次执行会在当前任务执行完成后立即开始,不会等待一个完整的周期。
  • 示例代码
java 复制代码
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        Runnable task = () -> System.out.println("周期性任务执行");
        scheduler.scheduleAtFixedRate(task, 2, 3, TimeUnit.SECONDS);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        scheduler.shutdown();
  • 解释 :在这个例子中,任务会在 2 秒(initialDelay)后首次执行,然后每隔 3 秒(period)执行一次。通过Thread.sleep(10000)让主线程等待一段时间,以便观察任务的周期性执行。最后关闭ScheduledExecutorService

scheduleWithFixedDelay

scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)

  • 功能描述 :安排一个任务在初始延迟(initialDelay)之后开始执行,并且在每次执行完成后,等待固定的延迟(delay)时间后再执行下一次任务。这与scheduleAtFixedRate不同,scheduleAtFixedRate是按照固定的频率执行,而这个方法是在上一次任务执行完成后等待固定的延迟时间再执行下一次。
  • 示例代码
java 复制代码
        ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
        Runnable task = () -> {
            System.out.println("任务开始执行");
            try {
                Thread.sleep(2000);  // 模拟任务执行时间
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("任务执行完成");
        };
        scheduler.scheduleWithFixedDelay(task, 2, 3, TimeUnit.SECONDS);
        try {
            Thread.sleep(15000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        scheduler.shutdown();
  • 解释 :在这个示例中,任务首先在 2 秒(initialDelay)后开始执行。任务本身会模拟执行 2 秒(通过Thread.sleep(2000)),然后在任务执行完成后,等待 3 秒(delay)再执行下一次任务。通过Thread.sleep(15000)让主线程等待足够长的时间来观察任务的执行情况,最后关闭ScheduledExecutorService
相关推荐
m0_7482565627 分钟前
Rust环境安装配置
开发语言·后端·rust
梅洪32 分钟前
ASP.NET Core API 前后端分离跨域
后端·bootstrap·asp.net
O(1)的boot34 分钟前
微服务的问题
java·数据库·微服务
一个略懂代码的程序员37 分钟前
Redis01
java·redis
IT界的奇葩42 分钟前
基于springboot使用Caffeine
java·spring boot·后端·caffeine
rookiesx1 小时前
springboot jenkins job error console log
spring boot·后端·jenkins
西埃斯迪恩-霖1 小时前
Idea导入SpringBoot3.2.x源码
java·ide·intellij-idea
凡人的AI工具箱1 小时前
40分钟学 Go 语言高并发教程目录
开发语言·后端·微服务·性能优化·golang
每天写点bug1 小时前
【golang】匿名内部协程,值传递与参数传递
开发语言·后端·golang
m0_748251722 小时前
Spring Boot 经典九设计模式全览
java·spring boot·设计模式