Java - 创建一个内部时钟

3

我希望能够在Java中从特定时间开始计算经过的毫秒数。

传统的方法是使用System.currentTimeMillis();获取起始时间,然后再次使用此函数并减去初始时间来获取经过的时间。我希望做类似的事情,但不要依赖系统时间。

如果依赖系统时间,程序的用户可能会篡改系统时钟以便入侵程序。

我已尝试使用类似以下代码的方式:

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

这种方法虽然可行,但当电脑出现卡顿并锁定一两秒钟时,它就不太可靠了。

有任何想法吗?


1
我可以问一下,如果有人更改了系统时钟,这会有什么影响吗? - Manual5355
@JosephShanak 他刚才说了,这是因为应用程序安全方面的考虑。 - Diosney
1个回答

6
您想要使用System.nanoTime。它与系统时钟无关。它只能用于跟踪相对时间,这似乎是您想要做的所有事情。
为了防止此答案仅成为另一个答案的链接,这里是一个简短的解释。
来自文档 public static long nanoTime() 返回以纳秒为单位的最精确可用系统计时器的当前值。
该方法仅用于测量经过的时间,与任何其他系统或挂钟时间的概念无关。返回的值表示自某个固定但任意时间(可能在未来,因此值可能为负)以来的纳秒数。此方法提供纳秒精度,但不一定具有纳秒精度。对于值更改的频率没有任何保证。跨越大约292年(2 ^ 63纳秒)的连续调用之间的差异将由于数字溢出而无法准确计算经过的时间。
另一个计时器信息的链接:https://blogs.oracle.com/dholmes/entry/inside_the_hotspot_vm_clocks 你可以使用Java的Timer类在特定的精度下生成“检查”回调,比如每500毫秒。这个回调不会用于确定实际经过了500毫秒。你会在回调中调用System.nanoTime并将其与上次调用System.nanoTime的时间进行比较。这将给你一个相当准确的时间间隔表示,无论墙上时钟如何改变。

你可以在这里查看:System.currentTimeMillis vs System.nanoTime


这似乎很合适。不知道它是如何获得其值的? - Dylan Wheeler
我真希望292年不是263纳秒,如果是的话,那我比我想象中要老得多了。 - Jeffrey
@JavaCoder-1337:它应该是2^63纳秒(而不是263)。上标格式丢失了。 - Greg Kopff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接