将Java虚拟机与System.nanoTime同步

时间:2011-10-13 11:06:02

标签: java synchronization nanotime

同步java虚拟机是否有意义 使用System.nanoTime()?

我的意思是:

  • 调用System.nanoTime()并将结果放入t1
  • A向B发送数据包
  • 当B收到A的数据包时,B调用System.nanoTime()并将结果发送给A
  • 当在A上接收到来自B的数据包时,A调用System.nanoTime()并将结果放入t3,将来自B的数据包中接收的时间放在t2中
  • timeshift =(t3-t1)/ 2-t2

使用System.nanoTime来做到这一点是正确的吗?

谢谢!

3 个答案:

答案 0 :(得分:8)

  

使用System.nanoTime来做到这一点是正确的吗?

没有。 System.nanoTime()仅用于测量单个JVM中的时间差异,而不是跨多个JVM的绝对时间。

  

此方法只能用于测量经过的时间,与系统或挂钟时间的任何其他概念无关。返回的值表示纳秒,因为某些固定但任意的原始时间(可能在未来,因此值可能为负)。在Java虚拟机的实例中,此方法的所有调用都使用相同的原点;其他虚拟机实例可能使用不同的来源。

要解决这个问题,通常你会使用System.currentTimeMillis(),但这仍然受到两台计算机的OS时钟的限制。 使用NTP在计算机之间同步时间。

请参阅Time synchronization between server and Internet using Java

答案 1 :(得分:0)

目前还不完全清楚你要实现的目标。

如果您正在尝试同步时钟,则会有专门的协议,例如NTPnanoTime()在任何情况下都无用,因为它的值在JVM之间无法比较。

如果您正在尝试测量延迟,请重复测量往返(t3-t1)并除以2。为此,确实可以使用nanoTime()

答案 2 :(得分:0)

System.nanoTime()相对于任意和未指定的时间点。根据我的观察,它似乎来自计算机的正常运行时间。

这使得在两台机器上比较nanoTime非常困难。

timeshift = (t3 + t1) / 2 - t2; // note the + instead of -

您使用的公式可用于近似两台机器之间的差异,但它可能会显示出巨大的差异。解决这个问题的一种方法是执行1000次并取平均值或中位数,这使我在过去得到了稳定的结果。

这个数字需要定期更新,因为即使温度可以加速或减慢纳米计时器。

注意:将两台机器可靠地保持在一毫秒内是令人惊讶的。 ;)

相关问题