java nanos_java命名空间java.util.concurrent.locks接口condition的类成员方法: awaitnanos定义及介绍...

这篇博客详细介绍了线程在等待条件满足、接收信号、被中断或等待超时后的处理方式。线程会原子性地释放锁并进入休眠状态,直到被唤醒、信号量被全部释放、被中断或等待时间到达。如果线程被中断,会抛出InterruptedException,并清除中断状态。文章讨论了如何在多线程环境中正确处理这些情况,包括在等待过程中检查剩余等待时间的方法和可能的重试策略。
摘要由CSDN通过智能技术生成

造成当前线程在接到信号、被中断或到达指定等待时间之前一直处于等待状态。

与此条件相关的锁以原子方式释放,并且出于线程调度的目的,将禁用当前线程,且在发生以下五种情况之一 以前,当前线程将一直处于休眠状态:其他某个线程调用此 方法,并且碰巧将当前线程选为被唤醒的线程;或者

其他某个线程调用此 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 - 如果当前线程被中断(并且支持中断线程挂起)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值