news 2026/4/16 7:20:43

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/4/13 5:23:49

Adobe acrobat 免费下载、安装图文教程(附安装包,图超详细)

Adobe acrobat 是一款针对 PDF 文件打造的办公工具&#xff0c;能读、能改、能合并、能签名、能加密&#xff0c;还能把纸质文件一键扫成可搜索的 PDF&#xff0c;是个人和企业处理电子文档的标配工具。 Adobe acrobat 主要用于创建、编辑、管理和签署 PDF 文件&#xff0c;支…

作者头像 李华
网站建设 2026/4/13 13:21:47

网络工程师想要转行,有没有啥建议?

网络工程师想要转行&#xff0c;有没有啥建议&#xff1f; 转行不是一时冲动&#xff0c;得先搞清楚动机。作为网络工程师&#xff0c;你可能已经掌握了TCP/IP协议、路由配置、防火墙设置这些硬核技能&#xff0c;但现实往往残酷。行业饱和了&#xff0c;新人涌入&#xff0c;…

作者头像 李华
网站建设 2026/4/16 5:38:28

35、Unix 拼写检查器与进程管理全解析

Unix 拼写检查器与进程管理全解析 1. Unix 拼写检查器发展历程 早期的 Unix 拼写检查器经历了多个版本的演变。最初的 Unix 拼写检查器是一个管道,之后出现了用 C 语言编写的版本。1975 年的 Version 6 Unix 中的 typo 命令,约 350 行 C 代码;1979 年 Version 7 Unix 发…

作者头像 李华
网站建设 2026/4/14 17:18:23

44、Unix文件系统:结构、特性与操作详解

Unix文件系统:结构、特性与操作详解 1. Unix文件系统简介 Unix操作系统通过将文件分组到目录中来管理大量文件,每个目录形成独立的命名空间,避免文件名冲突,同时便于文件管理。目录还能为文件提供默认属性。 Unix文件系统呈树状结构,根目录名为 / (ASCII斜杠)。斜杠…

作者头像 李华