java中的ScheduledExecutorService介绍和使用案例

ScheduledExecutorService 是 Java 并发包 java.util.concurrent 中的一个接口,它提供了一种机制,允许我们安排一个任务在给定的延迟后运行,或者定期地执行。

主要特点

  1. 单次调度:可以安排任务在一定的延迟后执行一次。
  2. 周期性调度:可以安排任务按照一定的周期重复执行。
  3. 线程池ScheduledExecutorService 实现了 ExecutorService 接口,因此它拥有线程池的特性,可以复用线程,提高效率。
  4. 灵活的调度策略:可以灵活地控制任务的执行时间。

使用案例

1. 单次调度
java 复制代码
import java.util.concurrent.*;

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

        scheduler.schedule(() -> {
            System.out.println("任务执行了");
        }, 5, TimeUnit.SECONDS); // 5秒后执行

        scheduler.shutdown();
    }
}
2. 周期性调度
java 复制代码
import java.util.concurrent.*;

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

        Runnable task = () -> {
            System.out.println("周期性任务执行了");
        };

        scheduler.scheduleAtFixedRate(task, 1, 3, TimeUnit.SECONDS); // 初始延迟1秒,之后每3秒执行一次

        // 如果需要在一定次数后停止
        scheduler.schedule(() -> scheduler.shutdown(), 10, TimeUnit.SECONDS);
    }
}
3. 固定延迟调度
java 复制代码
import java.util.concurrent.*;

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

        Runnable task = () -> {
            System.out.println("固定延迟任务执行了");
        };

        scheduler.scheduleWithFixedDelay(task, 1, 3, TimeUnit.SECONDS); // 初始延迟1秒,之后每次执行完任务后等待3秒再执行下一次

        // 如果需要在一定次数后停止
        scheduler.schedule(() -> scheduler.shutdown(), 10, TimeUnit.SECONDS);
    }
}

注意事项

  1. 资源管理 :使用 ScheduledExecutorService 时,需要正确管理资源,比如在不再需要时调用 shutdown()shutdownNow() 方法来关闭线程池。
  2. 异常处理:任务中抛出的异常不会影响其他任务的执行,但是如果不处理,可能会导致任务终止。
  3. 线程安全 :提交给 ScheduledExecutorService 的任务应该是线程安全的,或者在任务内部正确处理同步。

ScheduledExecutorService 是一个非常强大的工具,可以帮助我们处理需要定时或周期性执行的任务,而且它还提供了线程池的优化,使得资源利用更加高效。

相关推荐
丘山一郎14 小时前
Spring 中的IOC控制反转 和DI依赖注入
java·后端·spring
码视野14 小时前
基于 Spring Boot + Vue3 的【大学英语四六级 (CET-4/6) 作文智能评分与句式润色系统】设计与实现(含PRD/三端高保真源码/大屏)
java·前端·人工智能·spring boot·后端·vue3
MetaLite14 小时前
Spring-AOP自调用为什么失效-AopContext真能解决吗
java·后端·spring
大模型码小白14 小时前
AI 对话流性能调优:万级消息的虚拟滚动落地
java·大数据·前端·javascript·人工智能·算法·机器学习
许彰午15 小时前
14-字段级SM4加密与SM2签名
java·低代码·架构
许彰午16 小时前
13-describe元数据输出
java·低代码·架构·状态模式
用户37215742613517 小时前
Java 设置 Word 文档编辑限制并允许指定区域编辑
java
宠友信息17 小时前
社区类源码开发实践中的仿小红书系统技术要点分析
java·spring boot·redis·mysql·uni-app·vue·内容运营
用户37215742613518 小时前
Java 设置 PDF 表单域只读或扁平化
java
luteres19 小时前
Spring学习笔记
java·后端·spring