开发人员经常会遇到这样的方法调用场景:调用一个方法时等待一段时间(一般来说是给 定一个时间段),如果该方法能够在给定的时间段之内得到结果,那么将结果立刻返回,反之, 超时返回默认结果。
这里可以借鉴等待/通知的经典范式,即加锁、条件循环和处理逻辑3个步骤,而这种 范式无法做到超时等待。而超时等待的加入,只需要对经典范式做出非常小的改动,
改动内容 如下所示。 假设超时时间段是T,那么可以推断出在当前时间now+T之后就会超时。 定义如下变量。 ·
等待持续时间:REMAINING=T。 ·
超时时间:FUTURE=now+T。
这时仅需要wait(REMAINING)即可,在wait(REMAINING)返回之后会将执行: REMAINING=FUTURE–now。如果REMAINING小于等于0,表示已经超时,直接退出,否则将 继续执行wait(REMAINING)。
public synchronized Object Timeget(long timeoutDuration) throws InterruptedException {
long future = timeoutDuration+System.currentTimeMillis();
long remaining = timeoutDuration;
while (result == null && remaining>0){
wait(remaining);
remaining = future-System.currentTimeMillis();
}
return result;
}
这里需要注意 result是方法外部定义好的一个对象,用他是否为空和是否超过等待时间两方面判定是否需要继续等待.我这里设置的是进入循环之后直接等待 设定的超时等待时间的时间,保证下一次不用等待直接尝试获取锁.