2011-10-13 29 views
2

使用System.nanoTime()同步Java虚拟机 有意义吗?使用System.nanoTime同步Java虚拟机

我的意思是:

  • 呼叫System.nanoTime(),并把在t1时的结果
  • 甲发送一个数据包到B
  • 当B被接收到来自所述分组,B呼叫System.nanoTime()并将结果发送到A
  • 当来自B的数据包在A上接收时,A调用System.nanoTime()并将结果放入t3中,将从B接收的数据包放入t2中
  • 时移=(t3 - t1)/ 2 - t2

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

谢谢!

+1

为什么你需要这样的东西?如果您需要在计算机之间进行时间同步,那么这是一个已解决的问题(例如NTP)。 –

回答

8

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

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

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

要解决这个问题,一般来说你会使用System.currentTimeMillis(),但这仍然受到两台计算机的操作系统时钟的限制。 使用NTP在计算机之间同步时间。

请参阅Time synchronization between server and Internet using Java

+0

在不同机器上的历元时间里,我们可以在Java中获得至少微秒精度吗? – chrisapotek

+0

@chrisapotek即使在单台机器上,您使用哪种方法获得μs的纪元时间?我不认为有内置的,所以...可能不是。 –

0

这并不完全清楚你想要达到的目标。

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

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

0

System.nanoTime()是相对于任意时间点的任意时间点。从我所观察到的情况来看,它似乎来自计算机的正常运行时间。

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

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

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

此图需要定期更新,因为即使温度可以加快或减慢纳秒定时器。

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