这个任务是要求每秒触发一次。
一开始我尝试用 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 去掉之后会出现意想不到的现象。
通过打印结果,可以看出基本符合我的要求了,行啦。
问题是如果想要更加精确一点,要怎么做呢?