首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果semaphore.acquire()获得InterruptedException,需要使用semaphore.relase()吗?

如果semaphore.acquire()获得InterruptedException,需要使用semaphore.relase()吗?
EN

Stack Overflow用户
提问于 2012-08-24 15:31:32
回答 3查看 11.5K关注 0票数 13

从Java的java.util.concurrent.Semaphore文档中,我不太清楚如果semaphore.acquire()阻塞线程,然后被InterruptedException中断会发生什么。信号量的值是否减少了,是否需要释放信号量?

目前我使用的代码如下:

代码语言:javascript
复制
try {
  // use semaphore to limit number of parallel threads
  semaphore.acquire();
  doMyWork();
}
finally {
  semaphore.release();
}

或者,当在acquire()过程中发生InterruptedException时,我不应该调用release()?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-24 15:48:13

在acquire()过程中发生InterruptedException时,

调用release()?

你不应该这样做。如果.acquire()被中断,信号量就不会被获取,因此很可能不会释放它。

你的代码应该是

代码语言:javascript
复制
// use semaphore to limit number of parallel threads
semaphore.acquire();
try {
  doMyWork();
}
finally {
  semaphore.release();
}
票数 13
EN

Stack Overflow用户

发布于 2014-02-21 13:23:03

除了semaphore.acquire()也抛出InterruptedException之外,nos接受的答案是部分正确的。因此,要做到100%正确,代码应该如下所示:

代码语言:javascript
复制
try {
    semaphore.acquire();
    try {
        doMyWork();
    } catch (InterruptedException e) { 
        // do something, if you wish
    } finally {
        semaphore.release();
    }
} catch (InterruptedException e) {
    // do something, if you wish
}
票数 8
EN

Stack Overflow用户

发布于 2012-08-24 15:55:01

如果线程在获取方法调用之前被中断,或者在等待获取许可时,InterruptedException将被抛出,并且不会持有任何许可,因此不需要释放。只有当您确定获得了许可证时(在调用acquire方法调用之后),您才需要释放许可证。因此,您最好在try代码块开始之前获取,如下所示:

代码语言:javascript
复制
sem.acquire();
try{
   doMyWork();
}finally{
   sem.release();
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12104978

复制
相关文章

相似问题

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