确定超时方法的剩余时间

时间:2014-03-11 20:49:49

标签: java timeout locking contract

我正在尝试编写一个锁类来帮助处理我需要能够优先处理各种线程对同步资源的访问的情况,但是我遇到了遇到Lock::tryLock(long time, TimeUnit unit)合同的问题。 / p>

我目前的方法是:

@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
    if(super.tryLock(time, unit)) //my class extends `ReentrantLock`
        if(next.tryLock(time, unit))
            return true;
        else
            super.unlock();
    return false;
}

乍一看,这似乎没有错,问题是合同方法必须在time unit之后超时,而此方法可能需要两次这一点。

为了做到这一点,我需要能够确定super.tryLock花费了多少时间,然后只给next.tryLock剩余的时间。

我考虑过使用Timer TimerTasktime每个TimeUnit减少{/ 1}}:

new Timer().scheduleAtFixedRate(
    new TimerTask(){
        @Override
        public void run() {
                //Decrement time somehow
        }
    },
    0, unit.toMillis(1));

但是,这对于小于毫秒的单位不起作用,可能需要多于指定单位的单位(我们知道,这可能是TimeUnit.DAYS)。

1 个答案:

答案 0 :(得分:0)

尝试使用System.nanoTime()测量经过的时间并从剩余时间中减去它; 292年几乎肯定比使用tryLock的任何线程都要等待(或者甚至仍然存在)。

@Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
    long start = System.nanoTime();

    if(super.tryLock(time, unit)){

        time -= unit.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS);

        if(next.tryLock(time, unit))
            return true;
        else
            super.unlock();
    }
    return false;
}