繁体   English   中英

Java计时,System.nanoTime()比System.currentTimeMillis()更糟糕,但它是否会在睡眠中持续存在?

[英]Java timing, System.nanoTime() batter than System.currentTimeMillis() but does it persist over sleep?

我正在尝试实现一个计时器,它可能用于短(秒)事件或更长(小时等)的事件。

理想情况下,它应该在CPU关闭的时间段内持续存在,例如,电池已经耗尽。 如果我使用System.currentTimeMillis()和结束时间使用相同的函数设置开始时间,它几乎适用于所有情况,除非在闰秒,闰年,夏令时变化等期间...或者,如果用户只是改变时间(我已经验证了这一点)。 这是在Android系统上,顺便说一句。

相反,如果我使用System.nanoTime(),除了可能更准确,它将不会有通常的“困难时间”问题与时间的变化等。我的问题是,System.nanoTime()测量纳秒来自一些任意的时间,在“艰难时期”? 我不确定正确的术语是什么,但是例如,System.nanoTime()会在X处运行,然后是X + 1小时后,系统会关闭(例如Android设备上的电池耗尽),然后是X +10小时,系统启动,此时运行System.nanoTime()会返回10个小时? 或者它会返回1小时(因为当系统关闭/睡眠时,nanoTime使用的“计数器”可能无法运行?)。

android.os.SystemClock.elapsedRealtime() - 自系统启动以来的毫秒数,包括在睡眠状态下花费的时间。 这应该是你最好的选择。

我不认为你可以测量android中的关闭时间。

有关更多信息,最好检查android系统时钟页面。 http://developer.android.com/reference/android/os/SystemClock.html

是未定义的

“返回的值表示纳秒,因为某些固定但任意的原始时间(可能在未来,因此值可能是负数)。在Java虚拟机的实例中,此方法的所有调用都使用相同的原点;其他虚拟机实例可能会使用不同的来源。“

为简单起见,我们会说当你在时间X运行它时,原点是X(这是允许的)。 这意味着它将返回0,然后在VM实例中,时间将以与正常时钟相同的速率流逝。

当您使用Thread.sleep时,它不会更改VM实例,因此不会对其进行特殊处理。

但是,重新启动设备后,您将处于不同的VM实例中。 因此,X不再保证是原点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM