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
相关产品推荐
相关产品推荐

