java - 如何在不损失纳秒级精度的情况下使用 TimeUnit.timedWait()?

标签 java concurrency time-wait

我正在尝试实现 Future.get(long, TimeUnit)TimeUnit.timedWait(Object, long) 方面.

目前尚不清楚如何使用 TimeUnit.timedWait(Object, long) 来处理虚假唤醒而不丢失 TimeUnit 的纳秒部分。通常你会做这样的事情:

public V get(long timeout, TimeUnit unit)
{
  long expirationTime = new Date().getTime() + unit.toMillis(timeout);
  while (!condition)
  {
    long timeLeft = expirationTime - new Date().getTime();
    if (timeLeft <= 0)
      throw new TimeoutException();
    unit.timedWait(object, timeLeft);
  }
}

但是你失去了纳秒部分。如果每个人都简单地放弃纳秒组件,那么 TimeUnit 甚至支持纳秒并提供 TimeUnit.timedWait() 有什么意义?

最佳答案

在你等待之前,存储你想要超时的时间。

在通知等待线程之前,设置一些共享(同步)状态信号,告知等待线程应该停止等待,因为计算已完成。

当您的线程由于任何原因从等待中醒来时,它应该检查共享状态以查看它是否应该停止等待,并且它还应该检查在超时到期之前还剩下多长时间。如果超时未过期,并且共享状态告诉没有停止等待,那么您应该再次等待(但使用从当前时间计算的新的更短的超时)。

关于java - 如何在不损失纳秒级精度的情况下使用 TimeUnit.timedWait()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1975620/

相关文章:

java - 动态编。 Algo 矩形包装

php - Apache Benchmark - 并发和请求数

node.js - 许多请求作为 TIME_WAIT - 这会导致 node.js 服务器出现并发问题吗?

c++ - 如何使用 rand_r 以及如何以线程安全的方式使用它?

c - 使用全局变量同步 p_threads

http - 服务器每秒处理 70 个请求,每个请求的响应时间小于 50 毫秒

connection-pooling - python中的MySQL连接池?

c# - 哪种技术更适合成为移动开发人员 C# 或 java?

java - Apache Camel 和 jackson

java - 如何在 Java 代码中访问 Spring 执行器健康检查的结果?