Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中的超时锁_Java_Locking_Timeout - Fatal编程技术网

java中的超时锁

java中的超时锁,java,locking,timeout,Java,Locking,Timeout,我正在寻找能够帮助我实现以下模式(伪代码)的机制: 我需要将调用execute的次数限制为不超过某个指定的间隔(例如,两分钟),但如果没有必要,我不想阻止prepare或execute。我想知道java是否支持任何锁定机制,这些机制在一段时间后会“消失”。当然,要求是锁不会通过,即使它是由锁定它的同一个线程输入的 我在考虑涉及信号量和时间任务的解决方案,或者自己计算截止日期并睡上多余的时间,但我想知道这样的解决方案是否已经可用 谢谢你可以睡一觉了 sleep(1000); 无需特殊课程: sy

我正在寻找能够帮助我实现以下模式(伪代码)的机制:

我需要将调用execute的次数限制为不超过某个指定的间隔(例如,两分钟),但如果没有必要,我不想阻止prepareexecute。我想知道java是否支持任何锁定机制,这些机制在一段时间后会“消失”。当然,要求是锁不会通过,即使它是由锁定它的同一个线程输入的

我在考虑涉及信号量和时间任务的解决方案,或者自己计算截止日期并睡上多余的时间,但我想知道这样的解决方案是否已经可用


谢谢

你可以睡一觉了

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();
    }

}