简单实现超时等待

       开发人员经常会遇到这样的方法调用场景:调用一个方法时等待一段时间(一般来说是给 定一个时间段),如果该方法能够在给定的时间段之内得到结果,那么将结果立刻返回,反之, 超时返回默认结果。

        这里可以借鉴等待/通知的经典范式,即加锁、条件循环和处理逻辑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是方法外部定义好的一个对象,用他是否为空和是否超过等待时间两方面判定是否需要继续等待.我这里设置的是进入循环之后直接等待 设定的超时等待时间的时间,保证下一次不用等待直接尝试获取锁.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值