这个任务是要求每秒触发一次。

一开始我尝试用 Timer 的 scheduleAtFixedRate,通过简单的测试,发现它会慢慢地累积形成时间差。

虽然这里不要求非常的精确,但是如果只是在某点附近徘徊,不会发生累积的,听起来是不是会好一点呢?

于是就诞生了下面的代码。

while (true) {
	try {
		long i = 1000 - System.currentTimeMillis() % 1000;
		if (i > 100) {
			Thread.sleep(i);
		} else {
			Thread.sleep(1000 + i);
		}
	} catch (InterruptedException e) {
		e.printStackTrace();
	}
	System.out.println(System.currentTimeMillis());
}

这里定的那个参照点就是每秒的零毫秒,先获取当前毫秒数,计算出到下一秒之间的毫秒数。

接下来的比较很重要,如果希望每秒只执行一次的话,这个是必须的,因为 java 的 sleep 真的不太可靠(这也是为什么需要和100毫秒做比较),实际执行时那是一个震荡状态,把 else 去掉之后会出现意想不到的现象。

通过打印结果,可以看出基本符合我的要求了,行啦。

问题是如果想要更加精确一点,要怎么做呢?