nanoTime可以跨线程工作吗?



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

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

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

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

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

如果你看到负的差异,很可能是你的代码有bug。

您可以看到机器之间的nanoTime(),但是您必须调整时钟之间的差异和漂移。(如果你不做这个修正,你会得到非常负面的结果)

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

在机器之间,你需要

  • 使用System.currentTimjeMillis(),使用NTP通常精确到毫秒。
  • 使用System.nanoTime()进行往返,即从a发送一条消息到B,再发送一条消息到a。从中可以估计往返时间的一半。
  • 使用System.nanoTime()不是用于运行时间,而是用于检测抖动。这假设大多数时候延迟是可以接受的(比如10 - 100微秒),但有时它比正常情况要高得多。我使用这个类来帮助检测抖动。RunningMinimum

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

相关内容

  • 没有找到相关文章

最新更新