总结:
scheduleAtFixedRate ,是以上一个任务开始的时间计时,period时间过去后,检测上一个任务是否执行完毕,如果上一个任务执行完毕,则当前任务立即执行,如果上一个任务没有执行完毕,则需要等上一个任务执行完毕后立即执行。
scheduleWithFixedDelay,是以上一个任务结束时开始计时,period时间过去后,立即执行。
重点:
两个方法以不同的时间点作为参考。
例子:

package com.yuankai.t1.thread; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; public class ScheduleExecutorServiceTest { public static void main(String[] args) { ScheduleExecutorServiceTest test = new ScheduleExecutorServiceTest(); test.testWithFixedDelay(); } private ScheduledExecutorService executor; public ScheduleExecutorServiceTest() { executor = Executors.newScheduledThreadPool(4); } public void testAtFixedRate() { executor.scheduleAtFixedRate(new Runnable() { public void run() { System.out.println("===="); try { Thread.sleep(10000); System.out.println("执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } } }, 1000, 3000, TimeUnit.MILLISECONDS); } public void testWithFixedDelay() { executor.scheduleWithFixedDelay(new Runnable() { public void run() { System.out.println("===="); try { int i = 1 / 0; } catch (Exception e) { e.printStackTrace(); } /* try { Thread.sleep(10000); System.out.println("执行完毕"); } catch (InterruptedException e) { e.printStackTrace(); } */ } }, 1000, 3000, TimeUnit.MILLISECONDS); } }
注意:
通过ScheduledExecutorService执行的周期任务,如果任务执行过程中抛出了异常,那么过ScheduledExecutorService就会停止执行任务,且也不会再周期地执行该任务了。所以你如果想保住任务都一直被周期执行,那么catch一切可能的异常。
分类:
java基础知识点
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)