System.nanotime() 的安全时间基准是什么?

3
我正在使用变量time_of_last_call作为我的时间起点;因为nanoTime()可能会给出负值,所以我不能使用0作为初始化time_of_last_call的时间起点。如果我使用Long.MIN_VALUE初始化time_of_last_call,则可能存在溢出问题。有什么建议吗?
编辑:我认为我应该将其初始化为:
long time_of_last_call = System.nanoTime()/1000000L;

//long time_of_last_call =Long.MIN_VALUE; //could have overflow issues
//long time_of_last_call =Long.MIN_VALUE/1000000; // could still have overflow issues?

//BEGIN OF CODE WITH A LOOP
// “time_of_last_call” may (or not) be updated: 
if (some_condition) 
    time_of_last_call=System.nanoTime()/1000000L;

if ( ( System.nanoTime()/1000000L - time_of_last_call ) > 10 )
    // do something
//END OF CODE WITH A LOOP

从来没有遇到过负的nanotime问题,我猜测你可能没有正确使用它。 - Steyrix
请问您能否发布导致System.nanoTime()返回负值的代码? - Steyrix
根据Javadoc的说明,它可能是负数。 - R.Groote
谢谢大家,根据Oracle的文档,nanoTime可能会返回负值。我刚刚编辑了我的问题。我认为将变量初始化为System.nanoTime()是安全的。 - user20191130
嗯,将其初始化为System.nanoTime()/1000000L会更好。 - Andreas
这取决于您想/需要做什么,以及其初始值的含义。可以使用布尔标志,或者像所示一样使用nanoTime()。无论如何,可以删除对1000000L的除法(假设发布的代码是其整个用法),与10 * 1000000L10_000_000L进行比较。 - user85421
1个回答

2
据我所知,纳秒时间没有“起点”。你只应该在两个时间瞬间之间寻找差异时使用它,此时“起点”是无关紧要的。
此外,据我记得,它不能保证在虚拟机重新启动后保持一致。因此,如果您持久化这个值,可能会遇到一些微妙的错误。
从您变量的命名来看,您想要做的只是跟踪调用时间。对于这种情况,您很可能不需要纳秒时间的精度和分辨率,因此最好使用 System.currentTimeMillis()。

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