我想要一个Java互斥锁,它允许我在一个线程中等待它,并在另一个线程中释放它。我知道我可以使用一个容量为1的信号量,但问题是"acquire()“方法抛出了"InterruptedException”。在Java中有什么特殊的同步方法来达到这个目的吗?
发布于 2012-10-23 03:05:55
幸运的是,Semaphore为您提供了此方法:)
public void acquireUninterruptibly()
从这个信号量获取一个许可证,阻塞,直到有一个可用为止。获取许可证,如果一个许可证可用并立即返回,则将可用许可证的数量减少一个。
如果没有可用的许可,则当前线程出于线程调度的目的而被禁用,并且处于休眠状态,直到其他线程为该信号量调用release()方法,并且下一个将为当前线程分配许可。
如果当前线程在等待许可时被中断,则它将继续等待,但是与没有发生中断的情况下线程接收许可的时间相比,该线程被分配许可的时间可能会改变。当线程从这个方法返回时,它的中断状态将被设置。
发布于 2012-10-23 02:50:41
InterruptedException不是问题,只需将其封装在一个循环中:
while(true) {
try {
semaphore.acquire();
break;
} catch(InterruptedException e) {
//swallow, continue;
}
}然而,这段代码并不是非常安全和优雅,但只要你“想要确保你能获得许可”,它就可以工作!
发布于 2012-10-23 02:48:47
如果你有一个线程要等待的代码,那么除非你使用的是同步化的块,否则你肯定要处理中断的异常。另外,中断异常的问题是什么?
https://stackoverflow.com/questions/13017683
复制相似问题