首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Java中用于线程间使用的互斥?

Java中用于线程间使用的互斥?
EN

Stack Overflow用户
提问于 2012-10-23 02:43:06
回答 4查看 243关注 0票数 0

我想要一个Java互斥锁,它允许我在一个线程中等待它,并在另一个线程中释放它。我知道我可以使用一个容量为1的信号量,但问题是"acquire()“方法抛出了"InterruptedException”。在Java中有什么特殊的同步方法来达到这个目的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-10-23 03:05:55

幸运的是,Semaphore为您提供了此方法:)

public void acquireUninterruptibly()

从这个信号量获取一个许可证,阻塞,直到有一个可用为止。获取许可证,如果一个许可证可用并立即返回,则将可用许可证的数量减少一个。

如果没有可用的许可,则当前线程出于线程调度的目的而被禁用,并且处于休眠状态,直到其他线程为该信号量调用release()方法,并且下一个将为当前线程分配许可。

如果当前线程在等待许可时被中断,则它将继续等待,但是与没有发生中断的情况下线程接收许可的时间相比,该线程被分配许可的时间可能会改变。当线程从这个方法返回时,它的中断状态将被设置。

票数 3
EN

Stack Overflow用户

发布于 2012-10-23 02:50:41

InterruptedException不是问题,只需将其封装在一个循环中:

代码语言:javascript
运行
复制
while(true) {
    try {
        semaphore.acquire();
        break;
    } catch(InterruptedException e) {
        //swallow, continue;
    }
}

然而,这段代码并不是非常安全和优雅,但只要你“想要确保你能获得许可”,它就可以工作!

票数 1
EN

Stack Overflow用户

发布于 2012-10-23 02:48:47

如果你有一个线程要等待的代码,那么除非你使用的是同步化的块,否则你肯定要处理中断的异常。另外,中断异常的问题是什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13017683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档