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
相关推荐
zhanghaha13142 小时前
HTML系列教程:14_HTML 表单与输入框 <form>、<input> 零基础详解
java·前端·javascript
yxlalm7 小时前
Spring AI+RAG 01-项目背景与技术选型
java·人工智能·spring
程序员清风8 小时前
Java 后端高并发设计:线程池、限流、熔断与降级
java·数据库·oracle
码事漫谈8 小时前
多人共用一个 key,缓存命中率会不会因此降低?
后端
Seoyoneh8 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
海南java第二人9 小时前
对外 API 如何保证幂等性?插入数据 / 上传表格场景全方案汇总
java·幂等性
tryxr9 小时前
Chat2Excel 文件服务模块上传文件功能开发
java·项目·oss·easyexcel·文件服务
Tangyuewei9 小时前
Java 写 Agent:模型只是组件
java·开发语言
考虑考虑9 小时前
docker compose环境变量替换
运维·后端·自动化运维
彧azz10 小时前
Java学习语法篇:变量
java·学习