gpt4 book ai didi

java - nanoTime 可以跨线程工作吗

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:24:23 24 4
gpt4 key购买 nike

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

我在第一个线程推送之前在数据中添加了一个时间参数(使用 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 微秒),但有时它比正常情况高得多。我使用此类来帮助检测抖动。 RunningMinimum

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

关于java - nanoTime 可以跨线程工作吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39880775/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com