news 2026/9/22 21:28:22

ScheduledExecutorService 行为观察 Demo(可直接跑)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ScheduledExecutorService 行为观察 Demo(可直接跑)

这个 Demo 主要做两件事:

  • 建一个ScheduledThreadPoolExecutor(2),看看 2 线程时任务分配情况
  • 对比scheduleAtFixedRatescheduleWithFixedDelay的行为
  • 每个任务打印:当前时间、线程名、第几次执行

你可以新建一个ScheduledDemo.java直接运行:

import java.time.LocalTime; import java.time.format.DateTimeFormatter; import java.util.concurrent.*; public class ScheduledDemo { private static final DateTimeFormatter F = DateTimeFormatter.ofPattern("HH:mm:ss.SSS"); private static String now() { return LocalTime.now().format(F); } public static void main(String[] args) throws InterruptedException { // 2 个线程的定时线程池 ScheduledExecutorService ses = Executors.newScheduledThreadPool(2, new ThreadFactory() { private final ThreadFactory delegate = Executors.defaultThreadFactory(); private int idx = 1; @Override public Thread newThread(Runnable r) { Thread t = delegate.newThread(r); t.setName("sched-worker-" + (idx++)); return t; } }); System.out.println("[" + now() + "] main start"); // FixedRate 任务:理论上每 5 秒一次,task 执行 3 秒 Runnable fixedRateTask = new Runnable() { private int count = 0; @Override public void run() { String thread = Thread.currentThread().getName(); int curr = ++count; System.out.println("[" + now() + "] [FixedRate] 第 " + curr + " 次执行,线程 = " + thread); try { // 模拟执行 3 秒 TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { System.out.println("[" + now() + "] [FixedRate] 被中断,线程 = " + thread); Thread.currentThread().interrupt(); } } }; // FixedDelay 任务:每次执行完后,延迟 5 秒再执行,task 执行 3 秒 Runnable fixedDelayTask = new Runnable() { private int count = 0; @Override public void run() { String thread = Thread.currentThread().getName(); int curr = ++count; System.out.println("[" + now() + "] [FixedDelay] 第 " + curr + " 次执行,线程 = " + thread); try { // 模拟执行 3 秒 TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { System.out.println("[" + now() + "] [FixedDelay] 被中断,线程 = " + thread); Thread.currentThread().interrupt(); } } }; // 0 延时,之后每 5 秒触发一次(FixedRate) ses.scheduleAtFixedRate(fixedRateTask, 0, 5, TimeUnit.SECONDS); // 0 延时,执行完成之后等待 5 秒(FixedDelay) ses.scheduleWithFixedDelay(fixedDelayTask, 0, 5, TimeUnit.SECONDS); // 让 Demo 跑 40 秒,观察日志 TimeUnit.SECONDS.sleep(40); System.out.println("[" + now() + "] main shutdown"); ses.shutdown(); } }

你跑一下,会看到类似(大概意思):

  • FixedRate:如果 3s < 5s,就基本是每 5 秒一轮

  • FixedDelay:永远是 “执行 3 秒 + 延迟 5 秒 = 8 秒一轮”

  • 线程名会在sched-worker-1/sched-worker-2之间分配,你能清楚看到:
    同一个周期任务不会重叠执行,但是轮次之间可能换线程。

如果你想再观察“执行时间 > 间隔”的情况,把sleep(3)改成sleep(7),日志会更有意思:

  • FixedRate:会出现“补课式”紧接执行

  • FixedDelay:节奏变慢,但依旧“执行完 + 延时”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 5:17:57

缓存与数据库一致性解决方案深度解析

一、业务场景与挑战1.1 12306余票查询场景在12306系统中&#xff0c;用户需要实时查询列车不同站点、不同座位类型的余票信息。为提升查询性能&#xff0c;我们将余票信息缓存在Redis中。但在用户下单支付时&#xff0c;需要同时更新数据库和缓存中的余票数据。核心挑战&#x…

作者头像 李华
网站建设 2026/9/21 19:09:44

消息队列真仙:我的道念支持最终一致性

瑶池圣地&#xff0c;飞升台。九天罡风如刀&#xff0c;撕扯着白玉砌成的古老平台。万丈雷云在头顶凝聚&#xff0c;电蛇狂舞&#xff0c;酝酿着最后一重、也是最凶险的“九霄寂灭神雷”。台下&#xff0c;瑶池众仙娥、各方观礼道友&#xff0c;皆屏息凝神&#xff0c;目光聚焦…

作者头像 李华
网站建设 2026/9/22 0:42:56

Spring Boot项目推送Gitee全流程(进阶)

对于国内的Java开发者而言&#xff0c;将Spring Boot项目托管到Gitee是一个常见且高效的选择。本文将以IntelliJ IDEA为开发环境&#xff0c;手把手带你完成从项目初始化到代码成功推送的全过程&#xff0c;并澄清关键概念、解释核心命令&#xff0c;助你彻底掌握。 一、核心概…

作者头像 李华
网站建设 2026/9/21 22:13:50

Java毕设项目:基于Springboot大学校园自习室教室座位预约网站设计与实现基于springboot高校自习室预约系统的设计与实现(源码+文档,讲解、调试运行,定制等)

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华
网站建设 2026/9/22 0:43:33

JAVA打造同城羽馆预约,一键畅享运动

利用 JAVA 开发同城羽毛球馆预约系统&#xff0c;可以结合 高并发处理、实时交互、多端适配 等特性&#xff0c;打造一个 “一键预约、智能匹配、全流程数字化” 的运动服务平台&#xff0c;让用户轻松畅享羽毛球运动的乐趣。以下是具体实现方案与核心功能设计&#xff1a;一、…

作者头像 李华
网站建设 2026/9/22 22:15:30

经验贴 | 科学制定招聘需求与预算:HR 必看的逻辑与实操要点

招聘是企业补充人才、保障发展的核心环节&#xff0c;而科学制定招聘需求与预算则是招聘工作高效落地的前提。不少 HR 在实际工作中会陷入 “需求模糊导致招聘偏差”“预算失控造成资源浪费” 的困境&#xff0c;既影响招聘效率&#xff0c;也难以匹配业务发展诉求。本文结合实…

作者头像 李华