我想要一个Java中的Mutex,让我在一个线程中等待它并在另一个线程中释放它。我知道我可以使用容量为1的信号量,但问题是“acquire()”方法抛出“InterruptedException”。在Java中是否有任何特殊的同步方法用于此目的?
答案 0 :(得分:3)
幸运的是,Semaphore为您提供了这种方法:)
public void acquireUninterruptibly()
从此信号量获取许可,阻止直到一个 可用。获得许可证(如果有)并返回 立即将可用许可证的数量减少一个。
如果没有可用许可证,则当前线程将被禁用 线程调度的目的和休眠直到其他一些线程 为此信号量和当前线程调用release()方法 接下来将被分配许可证。
如果当前线程在等待许可时被中断,那么 它将继续等待,但是分配线程的时间 许可证可能会与收到许可证的时间相比发生变化 许可证没有发生中断。当线程确实返回时 此方法将设置其中断状态。
答案 1 :(得分:1)
InterruptedException
不是问题,只需将其包装成循环:
while(true) {
try {
semaphore.acquire();
break;
} catch(InterruptedException e) {
//swallow, continue;
}
}
然而,这段代码并不是非常安全和优雅,但只要您 想要确保获得许可证就可以使用!"
答案 2 :(得分:0)
如果您有一个线程要等待的代码,那么除非您使用synchronized块,否则您肯定必须处理中断的异常。另外,中断异常有什么问题?
答案 3 :(得分:0)
<强>的ThreadA 强>
volatile boolean waitCondition = true
synchronized(lockObject) {
while (waitContidion) {
lockObject.wait();
}
}
<强> ThreadB 强>
synchronized(lockObject) {
waitCondition = false;
lockObject.notifyAll();
}
或在锁定实例上使用条件/信号。
正确处理InterruptedException是非常重要的,至少你必须使用catch块中的 Thread.currentThread()。interrupt()方法设置它的中断标志。