我正在尝试编写一个锁类来帮助处理我需要能够优先处理各种线程对同步资源的访问的情况,但是我遇到了遇到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
TimerTask
,time
每个TimeUnit
减少{/ 1}}:
new Timer().scheduleAtFixedRate(
new TimerTask(){
@Override
public void run() {
//Decrement time somehow
}
},
0, unit.toMillis(1));
但是,这对于小于毫秒的单位不起作用,可能需要多于指定单位的单位(我们知道,这可能是TimeUnit.DAYS
)。
答案 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;
}