nanoTime可以跨线程工作

时间:2016-10-05 17:58:48

标签: java nanotime

我有一个线程将数据推入队列,另一个线程从队列中读取数据并对其进行处理。我想在处理之前检查数据在队列中的时间长度。

我在第一个线程推送之前在数据中添加了一个时间参数(使用System.nanoTime()计算)。一旦第二个线程处理它,它将计算System.nanoTime()并找出与数据中设置的上一个时间的差异。

这会正常吗?我问这个是因为我看到了日志中的负面差异。

更新

我想澄清的是,开始时间是由一个进程放在另一台机器上,差异是在另一台机器上计算的。

1 个答案:

答案 0 :(得分:3)

我在线程和进程之间使用了System.nanoTime()。在一台机器上,它是全局的和单调增加的(除了多插槽Windows XP)

如果您发现负面差异,则很可能是代码中存在错误。

您可以在机器之间看到nanoTime(),但您必须调整时钟之间的差异和漂移。 (如果你不进行这种修正,你可以得到很大的负面结果)

  

开始时间由一个进程放在另一台机器上,差异在另一台机器上计算。

在您需要的机器之间

  • 使用System.currentTimjeMillis(),通常使用NTP精确到毫秒。
  • 使用System.nanoTime()进行往返旅行,即从A ro B发送一条消息,将另一条消息发送回A.从此可以估计半往返时间。
  • 使用System.nanoTime()不是过去的时间,而是检测抖动。这假设大部分时间延迟是可接受的(例如10-100微秒),但有时它远高于正常值。我使用这个类来帮助检测抖动。 RunningMinimum

如果您只对数毫秒的延迟感兴趣,我会使用currentTimeMillis()