news 2026/4/23 14:03:04

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/23 9:45:40

34、使用 awk 实现简单拼写检查器

使用 awk 实现简单拼写检查器 在文本处理中,拼写检查是一项常见且重要的任务。本文将详细介绍如何使用 awk 语言实现一个简单的拼写检查器,包括字典的加载、命令行选项的处理、后缀规则的应用等关键步骤,并给出完整的代码示例。 1. 字典的获取 在编写拼写检查器时,首先需…

作者头像 李华
网站建设 2026/4/23 9:44:28

Stata 18 多元统计 + 数据管理 让数据分析更专业安装教程

前言 Stata 18 该版本在历代版本基础上&#xff0c;聚焦因果推断、元分析、生存分析等核心研究领域&#xff0c;全面强化统计分析能力&#xff0c;同时优化数据管理、图表制作与结果报告等功能模块&#xff0c;广泛适用于经济学、医学、社会学等学科的实证研究工作。 版本亮点…

作者头像 李华
网站建设 2026/4/23 9:45:35

48、Unix 技术知识全解析:从基础命令到前沿概念

Unix 技术知识全解析:从基础命令到前沿概念 1. 重要 Unix 命令 在 Unix 系统中,存在众多用于进程管理和文件操作的重要命令,这些命令是系统操作的基础。 - 进程相关命令 :包括用于创建、删除或管理进程的命令,如 at 可在指定时间执行作业, batch 会在系统负载不…

作者头像 李华
网站建设 2026/4/23 9:45:57

别再乱选了!LLM应用实时通信技术SSE、WebSocket、WebRTC全方位对比

一、核心技术原理剖析 在为大型语言模型&#xff08;LLM&#xff09;应用构建实时前后端通信系统时&#xff0c;选择正确的底层技术至关重要。本章节将深入剖析三种主流技术的核心原理&#xff1a; Server-Sent Events (SSE)&#xff0c;它作为服务器主导的单向数据流的黄金标…

作者头像 李华
网站建设 2026/4/23 9:46:54

MySQL MOD()函数详解与Python对比

✅ 一、MySQL 的 MOD() 函数是怎么计算的&#xff1f;MOD(x, y) 是取余数的操作&#xff0c;即&#xff1a; &#x1f449; x % y&#xff08;在数学上就是 x 除以 y 的余数&#xff09;&#x1f50d; 示例解析&#xff1a;SELECT MOD(31, 8), MOD(234, 0), MOD(46.6, 6);表达式…

作者头像 李华