news 2025/12/18 18:18:30

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进行投诉反馈,一经查实,立即删除!
网站建设 2025/12/15 17:08:06

面试还不会Java并发编程,看这篇就够了!

提到并发编程很多人就会头疼了&#xff1b;首先就是一些基础概念&#xff1a;并发&#xff0c;并行&#xff0c;同步&#xff0c;异步&#xff0c;临界区&#xff0c;阻塞&#xff0c;非阻塞还有各种锁全都砸你脸上&#xff0c;随之而来的就是要保证程序运行时关键数据在多线程…

作者头像 李华
网站建设 2025/12/15 17:05:36

网通领域核心设备解析:CPE、IP Phone 与 AP 技术全指南

在网络通信&#xff08;网通&#xff09;架构中&#xff0c;CPE&#xff08;用户驻地设备&#xff09;、IP Phone&#xff08;IP 电话&#xff09;与 AP&#xff08;无线接入点&#xff09;是实现 “网络接入 - 语音通信 - 无线覆盖” 的关键组件&#xff0c;广泛应用于家庭、企…

作者头像 李华
网站建设 2025/12/15 17:04:22

JAVA赋能羽馆预约,同城运动轻松开启

借助 JAVA 强大的技术生态与灵活的架构设计&#xff0c;打造一个 同城羽毛球馆预约系统&#xff0c;可以高效连接用户与场馆&#xff0c;实现“一键预约、智能匹配、无缝体验”&#xff0c;让运动爱好者轻松开启健身之旅。以下是基于JAVA的完整解决方案&#xff0c;涵盖技术实现…

作者头像 李华
网站建设 2025/12/17 11:00:53

经验贴 | 招聘需求预测与人力规划系统怎么用?HR 高效规划指南

在企业发展过程中&#xff0c;人力规划不合理、招聘需求与业务发展脱节是 HR 常面临的难题 —— 要么岗位空缺影响业务推进&#xff0c;要么人员冗余增加企业成本。招聘需求预测与人力规划系统作为 HR 工作的重要工具&#xff0c;能通过科学方法梳理业务需求、分析人力现状&…

作者头像 李华
网站建设 2025/12/15 17:01:30

Codex用于生成PyTorch数据增强代码的实际案例

Codex用于生成PyTorch数据增强代码的实际案例 在图像分类、目标检测等视觉任务中&#xff0c;一个常见但棘手的问题是&#xff1a;训练数据太少或过于单一&#xff0c;导致模型过拟合、泛化能力差。虽然我们知道数据增强能有效缓解这个问题——比如翻转、裁剪、调色——但真正…

作者头像 李华