我正在寻找能够帮助我实现以下模式(伪代码)的机制:
TimeoutLock lock = new TimeoutLock();
while(condition) {
prepare();
lock.enter(); //cannot enter until specified lock timeout elapses
execute();
lock.lockFor(2 minutes);
finish();
}
我需要将调用限制为执行不会比某些指定的间隔(例如,两分钟)更频繁地发生,但我不想阻止准备如果没有必要,可以执行。我想知道java是否支持任何锁定机制,一段时间后它会“消失”。要求是,当然,即使锁被锁定它的同一个线程输入,锁也不会通过。
我正在考虑涉及信号量和 TimerTask 的解决方案,或者自己计算截止日期并在多余时间内睡觉,但我想知道这样的事情是否已经可用。
由于
答案 0 :(得分:1)
无需特殊课程:
synchronized(lock) {
execute();
Thread.sleep(120 * 1000)
}
答案 1 :(得分:1)
以下将会这样做 基本上你有一个semphore只允许你访问,如果有可用的许可证,我这种情况零允许。所以它会在最终放弃之前尝试2000秒 - >
Semaphore s = new Semaphore(0);
Object lock = new Object();
synchronized(lock)
{
execute();
s.tryAcquire(2,TimeUnit.Minutes)
}
Thread.sleep
是一种蹩脚而低级的做法。不推荐
答案 2 :(得分:1)
As Marko says,您很可能希望通过将工作交给某种调度程序而不是阻塞该线程来实现此目的。
但是如果你确实想要这样做,我建议你通过在退出关键部分时记录时间戳,然后让进入的线程等待一段时间来通过。类似的东西:
public class TimeoutLock {
private boolean held;
private long available;
public void enter() throws InterruptedException {
acquire();
long pause;
while ((pause = available - System.currentTimeMillis()) > 0L) {
Thread.sleep(pause);
}
}
private synchronized void acquire() throws InterruptedException {
while (held) {
wait();
}
held = true;
}
public synchronized void lockFor(long period) {
held = false;
available = System.currentTimeMillis() + period;
notify();
}
}
答案 3 :(得分:0)
你可以使用睡眠
sleep(1000);