Java - 创建内部时钟

Con*_*ure 3 java time clock internal

我希望计算从Java中特定时间开始的毫秒数.

System.currentTimeMillis();用于开始时间的经典方式,然后再使用前一个来获取经过的时间.我希望做类似的事情,但不要依赖系统时间.

如果我依赖系统时间,程序的用户可以操纵系统时钟来破解程序.

我尝试使用类似于以下的代码:

int elapsed = 0;
while (true) {
    Thread.sleep(10);
    elapsed += 10;
}
Run Code Online (Sandbox Code Playgroud)

这是有效的,但是在计算机滞后然后锁定一两秒的情况下,它不太可靠.

任何人的想法?

And*_*ell 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