造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。
与此条件相关的锁以原子方式释放,并且出于线程调度的目的,将禁用当前线程,且在发生以下五种情况之一 以前,当前线程将一直处于休眠状态:
- 其他某个线程调用此
condition
的 signal()
方法,并且碰巧将当前线程选为被唤醒的线程;或者
- 其他某个线程调用此
condition
的 signalall()
方法;或者
- 其他某个线程中断当前线程,且支持中断线程的挂起;或者
- 已超过指定的等待时间;或者
- 发生“虚假唤醒”。
在所有情况下,在此方法可以返回当前线程之前,都必须重新获取与此条件有关的锁。在线程返回时,可以保证 它保持此锁。
如果当前线程:
- 在进入此方法时已经设置了该线程的中断状态;或者
- 在支持等待和中断线程挂起时,线程被中断,
则抛出 interruptedexception
,并且清除当前线程的已中断状态。在第一种情况下,没有指定是否在释放锁之前发生中断测试。
在返回时,该方法返回了所剩毫微秒数的一个估计值,以等待所提供的 nanostimeout
值的时间,如果超时,则返回一个小于等于 0 的值。可以用此值来确定在等待返回但某一等待条件仍不具备的情况下,是否要再次等待,以及再次等待的时间。此方法的典型用法采用以下形式:
synchronized boolean amethod(long timeout, timeunit unit) {
long nanostimeout = unit.tonanos(timeout);
while (!conditionbeingwaitedfor) {
if (nanostimeout > 0)
nanostimeout = thecondition.awaitnanos(nanostimeout);
else
return false;
}
// ...
}
设计注意事项:此方法需要一个 nanosecond 参数,以避免在报告剩余时间时出现截断错误。在发生重新等待时,这种精度损失使得程序员难以确保总的等待时间不少于指定等待时间。
实现注意事项
假定调用此方法时,当前线程保持了与此 condition
有关联的锁。这取决于确定是否为这种情况以及不是时,如何对此作出响应的实现。通常会抛出一个异常(比如 illegalmonitorstateexception
)并且该实现必须对此进行记录。
与响应某个信号而返回的普通方法相比,或者与指示所使用的指定等待时间相比,实现可能更喜欢响应某个中断。在任意一种情况下,实现必须确保信号被重定向到另一个等待线程(如果有的话)。
- 参数:
nanostimeout
- 等待的最长时间,以毫微秒为单位
- 返回:
nanostimeout
值减去花费在等待此方法的返回结果的时间的估算。正值可以用作对此方法进行后续调用的参数,来完成等待所需时间结束。小于等于零的值表示没有剩余时间。
- 抛出:
interruptedexception
- 如果当前线程被中断(并且支持中断线程挂起)