news 2026/7/10 4:18:32

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/7/9 19:59:35

PyTorch安装后如何加载Qwen3-32B?常见问题汇总

PyTorch安装后如何加载Qwen3-32B&#xff1f;常见问题汇总 在当前大模型快速落地的背景下&#xff0c;越来越多开发者尝试将高性能语言模型部署到实际业务系统中。尤其是像 Qwen3-32B 这样具备 320亿参数、支持128K上下文长度的开源强模型&#xff0c;正成为构建智能问答、代码…

作者头像 李华
网站建设 2026/7/10 10:09:53

Qwen3 + NPU 仿真实战 二. MAC 单元设计

Qwen3 NPU 仿真实战 第二节&#xff1a;单个 MAC 单元设计&#xff08;1616 阵列&#xff0c;支持 INT8/BF16&#xff09;1. MAC 单元在 LLM 推理中的作用 Qwen3 推理的主要计算量来自矩阵乘法&#xff08;MatMul/Linear&#xff09;&#xff0c;涵盖 QKV 投影、Attention Sco…

作者头像 李华
网站建设 2026/7/10 3:52:42

vivo Celeborn PB级Shuffle优化处理实践

一、背景近年来&#xff0c;随着vivo大数据平台的数据量和任务量持续快速增长&#xff0c;新增的计算机资源已无法满足不断扩大的存储和计算需求。同时&#xff0c;我们观察到互联网和算法等在线业务在白天流量高峰&#xff0c;而在夜间流量显著下降&#xff0c;导致部分服务器…

作者头像 李华
网站建设 2026/7/10 9:54:51

33、拼写检查:从Unix原型到awk实现

拼写检查:从Unix原型到awk实现 1. 拼写检查概述 拼写检查是一个有趣且具有挑战性的问题,有超过300篇研究论文和书籍都围绕它展开。在处理文本时,拼写检查能帮助我们发现并纠正错误,提高文本质量。下面我们将从不同角度探讨拼写检查的实现方式。 2. 原始Unix拼写检查原型…

作者头像 李华
网站建设 2026/7/10 11:20:46

38、Shell 可移植性问题与扩展

Shell 可移植性问题与扩展 1. 概述 POSIX 定义的 shell 语言比原始的 V7 Bourne shell 大得多,但比 ksh93 和 bash 这两种最常用的 Bourne shell 扩展版本所实现的语言小得多。如果你要进行利用 shell 语言扩展的重型脚本编写,很可能会使用这两种 shell 中的一种或两种。因…

作者头像 李华