java中的超时锁
我正在寻找能够帮助我实现以下模式(伪代码)的机制: 我需要将调用execute的次数限制为不超过某个指定的间隔(例如,两分钟),但如果没有必要,我不想阻止prepare或execute。我想知道java是否支持任何锁定机制,这些机制在一段时间后会“消失”。当然,要求是锁不会通过,即使它是由锁定它的同一个线程输入的 我在考虑涉及信号量和时间任务的解决方案,或者自己计算截止日期并睡上多余的时间,但我想知道这样的解决方案是否已经可用java中的超时锁,java,locking,timeout,Java,Locking,Timeout,我正在寻找能够帮助我实现以下模式(伪代码)的机制: 我需要将调用execute的次数限制为不超过某个指定的间隔(例如,两分钟),但如果没有必要,我不想阻止prepare或execute。我想知道java是否支持任何锁定机制,这些机制在一段时间后会“消失”。当然,要求是锁不会通过,即使它是由锁定它的同一个线程输入的 我在考虑涉及信号量和时间任务的解决方案,或者自己计算截止日期并睡上多余的时间,但我想知道这样的解决方案是否已经可用 谢谢你可以睡一觉了 sleep(1000); 无需特殊课程: sy
谢谢你可以睡一觉了
sleep(1000);
无需特殊课程:
synchronized(lock) {
execute();
Thread.sleep(120 * 1000)
}
下面的就可以了
基本上,你有一个semphore,它只允许你在有许可证的情况下访问,我在这个例子中是零许可证。因此,它将尝试2000秒,然后最终放弃
->
Thread.sleep
是一种蹩脚的低级方法。不推荐,您很可能希望通过将工作交给某种调度程序来完成,而不是阻塞线程
但是,如果您确实想这样做,我建议您在退出临界区时记录一个时间戳,并让进入的线程等待一段时间后再通过。比如:
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();
}
}
您绝对不应该将其设计为在超时期间阻止线程。调度方法是必须的。我会在ScheduledThreadPoolExecutor或DelayQueue周围使用包装器。我同意调度会更好。但你们能简单地解释一下为什么阻塞一个线程(任何线程?或者仅仅是一个主线程?)是一件坏事吗?当我们离开时,同步块锁被释放
Semaphore s = new Semaphore(0);
Object lock = new Object();
synchronized(lock)
{
execute();
s.tryAcquire(2,TimeUnit.Minutes)
}
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();
}
}