news 2026/2/17 15:43:06

ScheduledExecutorService计划任务方法总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ScheduledExecutorService计划任务方法总结

一、常用方法

  • schedule

特性说明
✅ 单次执行schedule仅执行一次,不同于scheduleAtFixedRatescheduleWithFixedDelay的周期性执行。
✅ 异步执行任务在后台线程池中执行,不会阻塞调用线程。
✅ 支持返回值与异常使用Callable可获取结果或捕获异常(通过future.get())。
✅ 可取消在任务执行前可调用cancel()取消。
❌ 不保证精确时间实际执行时间受系统负载、线程调度等因素影响,只是近似延迟。
❌ 不自动重试若任务抛出异常,不会重试(与周期任务不同)。
private static void schedule(ScheduledExecutorService service, final int sleepTime){ service.schedule(new Runnable() { @Override public void run() { long start = new Date().getTime(); System.out.println("schedule 开始执行时间 " + DateFormat.getTimeInstance().format(new Date())); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } long end = new Date().getTime(); System.out.println("schedule 执行花费时间= " + (end - start) / 1000+"s"); System.out.println("schedule 结束执行时间 " + DateFormat.getTimeInstance().format(new Date())); System.out.println(">>>>>>>>>>>>>>>>>>>"); } },5,TimeUnit.SECONDS); }

结论:只会执行一次,比较简单

  • scheduleAtFixedRate

延迟固定时间频率执行任务

任务执行耗时3s,period间隔为5s

scheduleAtFixedRate(service, 3000); private static void scheduleAtFixedRate(ScheduledExecutorService service, final int sleepTime) { service.scheduleAtFixedRate(new Runnable() { public void run() { long start = new Date().getTime(); System.out.println("scheduleAtFixedRate 开始执行时间 " + DateFormat.getTimeInstance().format(new Date())); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // long end = System.currentTimeMillis(); long end = new Date().getTime(); System.out.println("scheduleAtFixedRate 执行花费时间= " + (end - start) / 1000); System.out.println("scheduleAtFixedRate 结束执行时间 " + DateFormat.getTimeInstance().format(new Date())); System.out.println(">>>>>>>>>>>>>>>>>>>"); } }, 1000, 5000, TimeUnit.MILLISECONDS); }

场景一:任务执行耗时时长小于period间隔,任务执行完成后,会等到了延迟时间,再执行下一次任务,本次任务开始时间+延迟时间间隔=下次任务开始时间

场景二:任务执行耗时时长大于period间隔,任务执行耗时5秒,period间隔为3秒,本次任务完成后,下次任务启动会立即执行.

scheduleAtFixedRate(service, 5000); private static void scheduleAtFixedRate(ScheduledExecutorService service, final int sleepTime) { service.scheduleAtFixedRate(new Runnable() { public void run() { long start = new Date().getTime(); System.out.println("scheduleAtFixedRate 开始执行时间 " + DateFormat.getTimeInstance().format(new Date())); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // long end = System.currentTimeMillis(); long end = new Date().getTime(); System.out.println("scheduleAtFixedRate 执行花费时间= " + (end - start) / 1000+"s"); System.out.println("scheduleAtFixedRate 结束执行时间 " + DateFormat.getTimeInstance().format(new Date())); System.out.println(">>>>>>>>>>>>>>>>>>>"); } }, 1000, 3000, TimeUnit.MILLISECONDS); }

  • ​​​​​scheduleWithFixedDelay

scheduleWithFixedDelay(service, 2000); private static void scheduleWithFixedDelay(ScheduledExecutorService service, final int sleepTime) { service.scheduleWithFixedDelay(new Runnable() { public void run() { long start = new Date().getTime(); System.out.println("scheduleWithFixedDelay 开始执行时间:" + DateFormat.getTimeInstance().format(new Date())); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } long end = new Date().getTime(); System.out.println("scheduleWithFixedDelay执行花费时间=" + (end - start) / 1000 + "s"); System.out.println("scheduleWithFixedDelay执行完成时间:" + DateFormat.getTimeInstance().format(new Date())); System.out.println("======================================"); } }, 1000, 3000, TimeUnit.MILLISECONDS); }

场景一:任务执行耗时小于period间隔,任务执行耗时2秒,period间隔为3秒

结论:本次任务执行结束时间+period=下次任务开始时间

scheduleWithFixedDelay(service, 5000); private static void scheduleWithFixedDelay(ScheduledExecutorService service, final int sleepTime) { service.scheduleWithFixedDelay(new Runnable() { public void run() { long start = new Date().getTime(); System.out.println("scheduleWithFixedDelay 开始执行时间:" + DateFormat.getTimeInstance().format(new Date())); try { Thread.sleep(sleepTime); } catch (InterruptedException e) { e.printStackTrace(); } long end = new Date().getTime(); System.out.println("scheduleWithFixedDelay执行花费时间=" + (end - start) / 1000 + "s"); System.out.println("scheduleWithFixedDelay执行完成时间:" + DateFormat.getTimeInstance().format(new Date())); System.out.println("======================================"); } }, 1000, 3000, TimeUnit.MILLISECONDS); }

场景一:任务执行耗时大于period间隔,任务执行耗时5秒,period间隔为3秒

结论:本次任务执行结束时间+period=下次任务开始时间,delay是计算上一个任务执行结束的时间和本次任务开始时间的差值,此值和任务的执行时间就没有关系了

特性scheduleAtFixedRatescheduleWithFixedDelay
间隔基准上次开始时间上次结束时间
适用场景需要严格频率(如每5秒上报一次)需要固定空闲间隔(如每次处理完等3秒再处理)
任务超时影响可能导致任务“追赶”甚至连续执行始终保证任务间有 delay 间隔
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/8 0:38:25

狂奔不死机:电鱼智能 RK3588 B2B 版应对足式机器人高频振动挑战

什么是 电鱼智能 RK3588 B2B 版?电鱼智能 RK3588 B2B 版 是专为高动态机器人场景定制的旗舰核心板。它放弃了电脑内存条式的金手指插拔设计,改用底部集成的 4 组高密度工业级 B2B 连接器(如 Panasonic 或 Hirose 0.5mm 间距系列)。…

作者头像 李华
网站建设 2026/2/16 5:14:39

基于LabVIEW 2018的注册系统源码,老赖客户的克星

基于LabVIEW 2018开发的注册系统源码,可用于各种非标试验台的注册机制使用。 用户可以根据实际自行改公司Logo,机器名称,也可以根据自己喜欢的风格修改前面板等等。 该源程序可以直接融入各种系统的LabVIEW设计中使用。 是防止老赖客户的神器…

作者头像 李华
网站建设 2026/2/16 20:55:59

西门子S7-200PLC与MCGS组态联动下的污水处理智能控制设计

西门子S7_200PLC和MCGS组态的污水处理控制设计老铁们今天咱们唠点实在的工业自动化应用,污水处理厂里那套S7-200和MCGS组态配合的骚操作。这玩意儿可不是课本上那些理论,是实打实在某县污水处理站跑了两年的成熟方案。先说核心控制逻辑,五个污…

作者头像 李华
网站建设 2026/2/3 2:27:24

探索四旋翼PID控制仿真模型:Matlab实现与应用

四旋翼PID控制仿真模型 matlab仿真程序,支持姿态单独控制,阶跃信号,方波,正弦波直接输入姿态环,波形完美,可以选择接入位置环,定点控制,轨迹跟踪,一键切换轨迹等功能。 带…

作者头像 李华
网站建设 2026/2/17 2:35:28

机器学习的演进与深度学习的革命

从规则到洞察:机器学习的演进与深度学习的革命引言:当机器开始“学习”想象一下,你正在教一个孩子识别猫。你不会给他编写一套复杂的“猫识别规则”,而是展示大量猫的图片,并告诉他:“这些都是猫。”随着时…

作者头像 李华