You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java计时器计数过快求助:编写每秒倒计时Timer类出错排查

问题分析与修复方案

你的计时器跑得过快,主要是因为两个核心逻辑错误,我来一一拆解:

1. 等待时长的计算完全错误

你用了这个判断条件来等待:

while( ((System.nanoTime() - s) / 100000000) < x);

这里有两个致命问题:

  • 时间单位换算错误:1秒等于1_000_000_000纳秒,而你除以的是100_000_000(1e8),这意味着你把纳秒转换成了0.1秒的单位,不是秒。
  • 等待时长随x动态变化:你把等待条件和当前的x绑定,x初始是10时,等待时长是100.1=1秒;x变成9时,等待时长变成90.1=0.9秒;x变成8时是0.8秒……越到后面等待时间越短,自然看起来计时器跑得越来越快。

2. for循环的逻辑错误

你的循环写法是:

for(int i = 0; i <= x; x--)

这里的循环条件是i <= x,但i从0开始就再也没有更新过!这意味着循环会一直执行到x变成负数才停止(比如x从10降到-1时,0 <= -1不成立),导致你会多输出一个-1的tick。


修复后的代码

下面是修正后的版本,实现每秒计数一次从初始值到0的功能:

public class Eieruhr {
    private int x;
    public Eieruhr(int x) {
        this.x = x;
    }
    public static void main(String[] args) {
        Eieruhr eu = new Eieruhr(10);
        eu.start();
    }
    public void start() {
        // 从初始值x倒数到0,每次循环计数减1
        for (int count = x; count >= 0; count--) {
            // 先打印当前计数
            System.out.println("tick - " + count);
            // 如果已经到0,就不用再等待了
            if (count == 0) {
                break;
            }
            long startTime = System.nanoTime();
            // 固定等待1秒:直到当前时间与开始时间的差 >= 1秒(1e9纳秒)
            while (System.nanoTime() - startTime < 1_000_000_000) {
                // 空循环等待,也可以在这里加Thread.yield()让CPU更友好
            }
        }
    }
}

修复要点说明

  • 固定等待1秒:用System.nanoTime()记录开始时间,等待到时间差达到1e9纳秒(即1秒),保证每次间隔一致。
  • 正确的循环逻辑:从初始值开始倒数到0,每次count--,循环次数准确,不会多输出负数。
  • 优化细节:当计数到0时直接跳出,避免最后一次不必要的等待。

内容的提问来源于stack exchange,提问作者stepbysteptomathpro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:55:11