同步java虚拟机有意义吗与系统。
我的意思是:
- 呼叫系统。nanoTime()并将结果放在t1 中
- A向B发送数据包 当B接收到来自A的数据包时,B调用System.nanoTime()并将结果发送给A
- 当A收到来自B的报文时,A呼叫系统。nanoTime()并将结果放入t3,将从B接收到的数据包中的时间放入t2
- 时移= (t3 - t1)/2 - t2
使用System是否正确?
谢谢!
使用System是否正确?
。System.nanoTime()
仅用于测量单个JVM内的时间差异,而不是多个JVM的绝对时间。
此方法只能用于测量经过的时间,与任何其他系统或挂钟时间的概念无关。返回的值表示从某个固定但任意的起始时间(可能在将来,因此值可能是负的)开始的纳秒数。在Java虚拟机的实例中,该方法的所有调用都使用相同的起源;其他虚拟机实例可能使用不同的源。
要解决这个问题,通常您会使用System.currentTimeMillis()
,但这仍然受到两台计算机的操作系统时钟的限制。使用NTP同步计算机时间
System.nanoTime()相对于任意且未指定的时间点。从我的观察来看,它似乎是来自计算机的正常运行时间。
这使得比较两台机器上的nanoTime非常困难。
timeshift = (t3 + t1) / 2 - t2; // note the + instead of -
您使用的公式可以用来近似计算两台机器之间的差异,但它可能显示出巨大的差异。解决这个问题的一种方法是执行1000次并取平均值或中位数,这在过去给了我一个稳定的结果。
这个数字需要定期更新,因为即使温度也会加速或减慢纳米计时器。
注意:要让两台机器保持在一毫秒内是非常困难的。div;)
你想达到的目的并不完全清楚。
如果你试图同步时钟,有专门的协议,如NTP。nanoTime()
在任何情况下都是无用的,因为它的值在jvm之间是不可比较的。
如果您尝试测量延迟,那么重复测量往返(t3-t1
)并除以2。为此,可以使用nanoTime()
。