我有一个线程将数据推送到队列中,另一个线程从队列中读取数据并处理它。我想检查数据在被处理之前在队列中停留了多长时间。
在第一个线程推送之前,我在数据中添加了一个时间参数(使用System.nanoTime()
计算)。一旦第二个线程处理它,它将计算System.nanoTime()
并找出与数据中先前设置的时间的差值。
这个能正常工作吗?我问这个问题是因为我在日志中看到了负差异。
我想澄清一下,开始时间是由另一台机器上的一个进程放置的,并且在另一台机器上计算差异。
我在线程和进程之间使用了System.nanoTime()。在一台机器上,它既是全局的,又是单调递增的(多套接字Windows XP除外)
如果你看到负的差异,很可能是你的代码有bug。
您可以看到机器之间的nanoTime(),但是您必须调整时钟之间的差异和漂移。(如果你不做这个修正,你会得到非常负面的结果)
开始时间由一个进程放在另一台机器上,其差值在另一台机器上计算。
在机器之间,你需要
- 使用System.currentTimjeMillis(),使用NTP通常精确到毫秒。
- 使用System.nanoTime()进行往返,即从a发送一条消息到B,再发送一条消息到a。从中可以估计往返时间的一半。
- 使用System.nanoTime()不是用于运行时间,而是用于检测抖动。这假设大多数时候延迟是可以接受的(比如10 - 100微秒),但有时它比正常情况要高得多。我使用这个类来帮助检测抖动。RunningMinimum
如果你只对几毫秒的延迟感兴趣,我会使用currentTimeMillis()