news 2026/5/12 10:05:48

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/5/11 9:28:40

交通仿真软件:SUMO_(18).交通仿真中的机器学习应用

交通仿真中的机器学习应用 在交通仿真领域,机器学习技术的应用已经变得越来越广泛。通过机器学习,我们可以更准确地预测交通流量、优化交通信号控制、提高路径规划的效率等。本节将详细介绍如何在交通仿真软件中应用机器学习技术,特别是如何在…

作者头像 李华
网站建设 2026/5/3 5:05:59

刚拿到注塑厂报价单就懵?塑料粒子价格波动像坐过山车?今天直接甩你一套车间老师傅用了十年的硬核工具包,手把手教你拆解注塑成本(文末有彩蛋)

注塑成本计算和降本资料,内含注塑成本分析表,塑胶产品报价表,注塑成型周期及计算公式和各种塑料成本,有需求的朋友不要错过。 好评后送钣金、铸造、机加工等核价表材料费计算别只会用计算器敲,试试这个Python脚本&…

作者头像 李华
网站建设 2026/5/10 6:44:14

SVPWM控制异步电机PI双闭环变频调速系统。 附赠参考文档 用matlab仿真的 可查看结果

SVPWM控制异步电机PI双闭环变频调速系统。 附赠参考文档 用matlab仿真的 可查看结果。工业现场那些需要精准调速的传送带、风机设备里,藏着个硬核技术——基于SVPWM的异步电机双闭环变频调速。这玩意儿听着玄乎,其实拆开来看就是个带保镖的指挥官系统&am…

作者头像 李华
网站建设 2026/5/8 18:39:27

探索MATLAB中MMC - HVDC输电模型:从原理到实现

MATLAB代码:高压直流输电 关键词:MMC- HVDC,预测控制,电容均压 两端MMC- HVDC输电模型是基于MAT LAB/simulink软件搭建的。 下图的第一个和第二个模块分别是两侧的MMC模型,该模型的控制使用的是MPC控制策略&#xff0c…

作者头像 李华
网站建设 2026/5/5 9:15:41

锁定Nature!小样本学习是真的好发

小样本机器学习|学术人不容错过的高产赛道!数据稀缺是AI领域的长期痛点,而小样本学习以“少量数据就能实现高效学习”的核心优势,成为现实应用中不可或缺的技术,同时也成为学术研究的热门方向——技术迭代迅速、创新空…

作者头像 李华