Java ScheduledExecutorService 接口

news/2025/2/9 0:56:04/文章来源:https://www.cnblogs.com/szz1/p/18705646

简介

在现代 Java 应用程序中,调度任务是十分常见的需求,无论是定期执行、延迟执行或者重复执行任务,Java 提供了一套强大的工具来实现这些需求。ScheduledExecutorService 是 Java 提供的一个接口,它继承自 ExecutorService,专门用于调度任务。本文将深入探讨 ScheduledExecutorService 的基础概念、使用方法、常见实践以及最佳实践,帮助读者更好地理解和应用这一工具。

目录

  1. 基础概念
  2. 使用方法
    • 创建 ScheduledExecutorService
    • 调度一次性任务
    • 调度周期性任务
  3. 常见实践
    • 处理任务执行异常
    • 动态调整任务周期
  4. 最佳实践
  5. 小结
  6. 参考资料

基础概念

ScheduledExecutorService 是 Java 中一种功能强大的接口,用于调度命令在未来某个时间执行。它通过线程池执行任务,避免了传统 Timer 类的单线程限制,因而提供了更高的灵活性和可靠性。

一些关键特性包括:

  • 延迟任务:可以在指定的延迟后执行任务。
  • 周期性任务:可以按照固定延迟或固定速率重复执行任务。
  • 线程池管理:通过线程池来管理任务的执行,提升效率和资源利用率。

使用方法

创建 ScheduledExecutorService

要使用 ScheduledExecutorService,首先需要创建其实例。最简便的方法是通过 Executors 工具类来创建。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

调度一次性任务

可以使用 schedule(Runnable command, long delay, TimeUnit unit) 方法在指定的延迟后执行一次性任务。

scheduler.schedule(() -> {System.out.println("Task executed after delay");
}, 5, TimeUnit.SECONDS);

在上述代码中,任务将在 5 秒后执行。

调度周期性任务

固定延迟

使用 scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit) 方法可以在首次延迟后以固定延迟重复执行任务。任务完成后,延迟时间才开始计算。

scheduler.scheduleWithFixedDelay(() -> {System.out.println("Task executed with fixed delay");
}, 0, 10, TimeUnit.SECONDS);

固定速率

scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit) 方法则是在初始延迟后以固定速率进行调度,忽略任务执行时间,强调周期。

scheduler.scheduleAtFixedRate(() -> {System.out.println("Task executed at fixed rate");
}, 0, 10, TimeUnit.SECONDS);

常见实践

处理任务执行异常

ScheduledExecutorService 中的任务若抛出异常可能会导致任务不再执行。为了避免未捕获的异常影响调度,可以在任务中添加异常处理。

scheduler.scheduleWithFixedDelay(() -> {try {// Task implementation} catch (Exception e) {System.err.println("Exception in task: " + e.getMessage());}
}, 0, 10, TimeUnit.SECONDS);

动态调整任务周期

由于业务需求可能变化,动态调整任务的执行周期是常见要求。可以通过取消任务并重新调度达到目的。

ScheduledFuture<?> future = scheduler.scheduleWithFixedDelay(() -> {// Task implementation
}, 0, 10, TimeUnit.SECONDS);// 在需要时取消任务
future.cancel(false);// 重新调度任务
scheduler.scheduleWithFixedDelay(() -> {// Task implementation
}, 0, 5, TimeUnit.SECONDS);

最佳实践

  1. 选择合适的线程池大小:根据应用需求设定合适的线程池大小,以最佳化资源利用。
  2. 任务异常管理:避免在任务中出现未捕获的异常,以防止任务中断。
  3. 合理使用周期方法:根据实际需求选择固定延迟或固定速率方法。
  4. 资源清理:在不再需要 ScheduledExecutorService 时,调用 shutdown() 方法释放资源。
scheduler.shutdown();

小结

ScheduledExecutorService 是 Java 中用于任务调度的强大工具,通过其丰富的方法,开发者能够轻松实现复杂的调度任务。理解其基础概念、掌握其使用方法并遵循最佳实践,将能有效提高应用的可靠性和性能。

参考资料

  • Java Documentation - ScheduledExecutorService
  • Java Concurrency in Practice
  • Effective Java by Joshua Bloch
  • https://javaguidepro.com/java-basic/java-thread-pool/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/881055.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宏定义

宏定义 # 和 ## #号(将符号转为字符串) 这条定义中,定义了一个 PRINT 的宏函数预处理器遇到这样的宏,会将 #a 替换成以字符串表示的参数 a 例如:##号(连接符:将2个表达式连接到一起)预处理器会将这2条宏扩展成下面的代码我们可以看到:这2条宏定义其实就是定义了2个成员…

《Operating System Concepts》阅读笔记:p2-p8

《Operating System Concepts》学习第 2 天,p2-p8 总结,总计 7 页。 一、技术总结 1.operating system An operating system is software that manages a computer’s hardware。 2.system bus data bus, address bus, control bus 统称为 system bus。 二、英语总结(生词:…

踩坑---中断中调用系统定时器延时卡死

踩坑---中断中调用系统定时器延时卡死 背景 ​ 配置外部中断作为按键输入时,调用了系统滴答定时器为基准的延时。然后每次一按按键,单片机就卡死。一开始怀疑时中断没有配置好。反复研究中断配置是否出现错误,最后debug出来,发现卡在了// 3. 等待计数值变为0,判断CTRL标志…

windows 10 安装 wsl

在 windows 上安装 Debian 版本的 wsl以管理员身份运行 cmd,执行 wsl --help 可查看 wsl 的帮助信息。执行 wsl --list --online 查看可供安装的 wsl子系统 版本。执行 wsl --install --distribution Debian 安装 debian 版本的 wsl有了计划记得推动,不要原地踏步。

开学作业13

学习使用了vue中watch知识 可以实时更新数据 也非常好用

开学作业14

前几天也是这样通过打电话合作 前后端分着写 已经完成大部分前后端的交并 预计明天写完

做开学作业10

使用的是element ui vue2 springboot技术

手把手教你如何用飞书实现betterGI消息推送

在平时,我们一般会使用betterGI的一条龙系统来完成体力的刷取,有的人可能需要知道啥时候刷完体力方便远程关闭电脑啥的,这里给大家如何通过飞书实现BetterGI消息推送的方法 1、支持的事件提醒 事件列表 notify.test : 测试通知 domain.reward : 自动秘境奖励 domain.start :…

2025【重庆联通】活动

2025年2月8日更新 扫码显示详情及办理 扫码显示详情及办理 套餐资费和活动内容均来源于重庆联通【10010人工客服可查,中国联通app官方客服可查】 这里是下面的54个活动的办理名称,请确认【点击也可直接跳转到相应位置】1.云创安全组合包10元(CQ)-立即生效 2.云创数字人名片权…

LLVM+CMAKE+VScode

在mac上使用vscode+CMAKE+LLVM 配置C++环境 仅供参考,请多谅解 原先的vscode官方推荐插件intellisense实在是太慢,以至于在很多大型项目(ns3,OS)等进行静态检查的速度奇慢无比,并且大量消耗资源。于是尝试在mac上使用llvm+clangd进行配置。由于采用的是homebrew安装clang…

FastAPI for Machine Learning: Live coding an ML web application

FastAPI for Machine Learning: Live coding an ML web application https://www.bilibili.com/video/BV1kC411b7Se/?spm_id_from=333.788.videopod.sections&vd_source=57e261300f39bf692de396b55bf8c41b翻译:FastAPI用于机器学习:现场编码一个ML Web应用程序。欢迎!加…

08_LaTeX之自定义LaTeX命令和功能

本章的内容将让你能编写可重复利用的模块——宏包和文档类,并在其中自己定义命令和环境。08_\(\LaTeX{}\) 之自定义\(\LaTeX{}\)命令和功能 目录08_\(\LaTeX{}\) 之自定义\(\LaTeX{}\)命令和功能自定义命令和环境定义新命令定义环境xparse 宏包简介编写自己的宏包和文档类编写…