
本文详解如何通过添加循环结构改造单次计时的 clock 程序,使其真正模拟连续走动的电子钟,并给出可中断、格式规范、线程安全的完整实现方案。
本文详解如何通过添加循环结构改造单次计时的 clock 程序,使其真正模拟连续走动的电子钟,并给出可中断、格式规范、线程安全的完整实现方案。
要让 Clock 程序“持续运行”(即不断调用 tick() 模拟真实时钟的秒级推进),关键在于在 main 方法中引入可控循环——原代码仅执行一次 clock.tick(),自然只能前进一秒后停止。
但需注意:盲目使用 while(true) 会造成无终止的无限循环,既无法观察输出,也难以退出。理想方案应满足三点:
✅ 每次 tick() 后立即显示当前时间;
✅ 控制刷新节奏(避免过快闪烁);
✅ 提供手动退出机制(如输入特定指令或按 Ctrl+C)。
以下是优化后的完整可运行代码(含 Display、Clock 和增强版 Main):
import java.util.Scanner;
class Display {
private int value = 0;
private final int limit;
public Display(int limit) {
this.limit = limit;
}
public void increase() {
value = (value + 1) % limit; // 更健壮:直接取模,避免 if 判断
}
public int getValue() {
return value;
}
}
class Clock {
private final Display hour = new Display(24);
private final Display minute = new Display(60);
private final Display second = new Display(60);
public Clock(int h, int m, int s) {
// 验证输入合法性(可选增强)
if (h = 24 || m = 60 || s = 60) {
throw new IllegalArgumentException("Invalid time: hh in [0,23], mm/ss in [0,59]");
}
hour.value = h;
minute.value = m;
second.value = s;
}
public void tick() {
second.increase();
if (second.getValue() == 0) { // 秒归零 → 分进位
minute.increase();
if (minute.getValue() == 0) { // 分归零 → 时进位
hour.increase();
}
}
}
@Override
public String toString() {
return String.format("%02d:%02d:%02d",
hour.getValue(),
minute.getValue(),
second.getValue()
);
}
}
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.print("Enter initial time (hour minute second): ");
int h = in.nextInt(), m = in.nextInt(), s = in.nextInt();
Clock clock = new Clock(h, m, s);
System.out.println("Starting clock... Press Ctrl+C to stop.");
try {
while (true) {
System.out.print("\r" + clock); // \r 实现同一行刷新,更清爽
System.out.flush(); // 确保立即输出
clock.tick();
Thread.sleep(1000); // 暂停 1 秒,模拟真实秒针节奏
}
} catch (InterruptedException e) {
System.out.println("\nClock stopped.");
} finally {
in.close();
}
}
}
? 关键改进说明:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
Thread.sleep(1000):使每次tick()间隔 1 秒,符合物理时钟直觉; -
\r回车符 +flush():实现在控制台同一行动态刷新时间,避免滚动刷屏; -
try-catch InterruptedException:优雅捕获用户通过 Ctrl+C 发出的中断信号,确保资源释放; -
输入校验与封装优化:
Display的value设为private,强制通过方法访问,提升健壮性; -
取模替代条件判断:
value = (value + 1) % limit更简洁且不易出错(如limit=0时需额外防护,此处略)。
⚠️ 注意事项:
- 若需跨平台高精度定时,建议后续迁移到
ScheduledExecutorService; - 当前实现为单线程,若扩展为 GUI 或多钟并行,需考虑线程同步;
-
System.out.print("\r...")在部分 IDE(如 IntelliJ 默认终端)可能表现异常,可改用System.out.println(clock)并接受逐行输出。
至此,你的 Clock 不再是“点一下走一秒”的静态模型,而是一个真实、稳定、可交互的持续运行时钟系统。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










