nanoTime 可以跨线程工作吗

Can nanoTime work across threads

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

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

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

更新

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

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

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

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

the start time is put by a process in a different machine and the difference is calculated in a different machine.

您需要在机器之间选择

  • 使用 System.currentTimjeMillis(),对于 NTP,它通常精确到毫秒。
  • 使用 System.nanoTime() 进行往返,即从 A 到 B 发送一条消息,然后将另一条消息发送回 A。由此可以估算出半个往返时间。
  • 使用 System.nanoTime() 不是为了流逝的时间,而是为了检测抖动。这假定大部分时间延迟是可以接受的(比如 10 - 100 微秒),但有时它比正常情况高得多。我使用这个 class 来帮助检测抖动。 RunningMinimum

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