爪哇 - 创建一个内部时钟(Java - Creating an Internal Clock)

2019-09-17 14:33发布

我想从计算在Java中特定的时间以毫秒为单位经过的时间。

经典的方式,使用System.currentTimeMillis(); 为开始时间,然后与前一再次使用该工具来获取经过的时间。 我希望做一些类似的,但不依赖系统时间这一点。

如果我靠上的系统时间,该计划的用户可以操纵系统时钟破解程序。

我已经使用类似于下面的代码尝试:

int elapsed = 0;
while (true) {
    Thread.sleep(10);
    elapsed += 10;
}

这工作,但我不是在计算机落后的情况下也可靠,然后一两秒钟锁定。

任何想法吗?

Answer 1:

你想使用System.nanoTime 。 它有没有关系系统时钟。 它只能被用来跟踪这似乎是所有你想要做的相对时间。

在努力防止这种回答摆明这里另一个答案的链接是一个简短的说明。

从技术文档

公共静态长nanoTime()返回最准确的可用系统计时器的当前值,在纳秒。

这种方法只能用来测量经过的时间,并且不涉及到的系统或挂钟时间的任何其它概念。 返回的值表示自一些固定的,而是任意时间纳秒(也许在将来,所以值可以是负的)。 此方法提供纳秒的精度,但不一定纳秒的精度。 没有任何保证有关如何频繁值的变化。 在由于数值溢出连续调用跨越大于约292年(2 63纳秒)将不会准确地计算经过的时间有较大的差异。

另一个链接到计时器信息: https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks

你可以使用Java的Timer类在某些特定精度产生一个“检查”的回调,可以说每500ms。 这个回调将不会被用来确定为500ms实际上并通过。 你会打电话System.nanoTime回调,并将它与您最后一次System.nanoTime 。 这将使你不管挂钟变化的已经过去的时间量的相当准确的描述。

你可以在这里看看: System.currentTimeMillis的VS System.nanoTime



文章来源: Java - Creating an Internal Clock