6

我有一个将数据推送到队列中的线程和另一个从队列中读取数据并处理它的线程。我想在处理之前检查数据在队列中的停留时间。

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

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

更新

我想澄清一下,开始时间是由不同机器中的进程设置的,而差异是在不同机器中计算的。

4

1 回答 1

3

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

如果您看到负面差异,很可能是您的代码中的错误。

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

开始时间由不同机器中的进程设置,差异在不同机器中计算。

在您需要的机器之间

  • 使用 System.currentTimjeMillis() ,它通常在 NTP 中精确到毫秒。
  • 使用 System.nanoTime() 进行往返,即从 A ro B 发送一条消息,将另一条消息发送回 A。由此可以估计半往返时间。
  • 使用 System.nanoTime() 不是为了经过时间,而是为了检测抖动。这假设大部分时间延迟是可以接受的(比如 10 - 100 微秒),但有时它比正常情况要高得多。我使用这个类来帮助检测抖动。运行最小值

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

于 2016-10-05T18:12:34.503 回答