Con*_*ure 3 java time clock internal
我希望计算从Java中特定时间开始的毫秒数.
它System.currentTimeMillis();用于开始时间的经典方式,然后再使用前一个来获取经过的时间.我希望做类似的事情,但不要依赖系统时间.
如果我依赖系统时间,程序的用户可以操纵系统时钟来破解程序.
我尝试使用类似于以下的代码:
int elapsed = 0;
while (true) {
    Thread.sleep(10);
    elapsed += 10;
}
这是有效的,但是在计算机滞后然后锁定一两秒的情况下,它不太可靠.
任何人的想法?
你想利用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