从Java的java.util.concurrent.Semaphore文档中,我不太清楚如果semaphore.acquire()阻塞线程,然后被InterruptedException中断会发生什么。信号量的值是否减少了,是否需要释放信号量?
目前我使用的代码如下:
try {
// use semaphore to limit number of parallel threads
semaphore.acquire();
doMyWork();
}
finally {
semaphore.release();
}或者,当在acquire()过程中发生InterruptedException时,我不应该调用release()?
发布于 2012-08-24 15:48:13
在acquire()过程中发生InterruptedException时,
调用release()?
你不应该这样做。如果.acquire()被中断,信号量就不会被获取,因此很可能不会释放它。
你的代码应该是
// use semaphore to limit number of parallel threads
semaphore.acquire();
try {
doMyWork();
}
finally {
semaphore.release();
}发布于 2014-02-21 13:23:03
除了semaphore.acquire()也抛出InterruptedException之外,nos接受的答案是部分正确的。因此,要做到100%正确,代码应该如下所示:
try {
semaphore.acquire();
try {
doMyWork();
} catch (InterruptedException e) {
// do something, if you wish
} finally {
semaphore.release();
}
} catch (InterruptedException e) {
// do something, if you wish
}发布于 2012-08-24 15:55:01
如果线程在获取方法调用之前被中断,或者在等待获取许可时,InterruptedException将被抛出,并且不会持有任何许可,因此不需要释放。只有当您确定获得了许可证时(在调用acquire方法调用之后),您才需要释放许可证。因此,您最好在try代码块开始之前获取,如下所示:
sem.acquire();
try{
doMyWork();
}finally{
sem.release();
}https://stackoverflow.com/questions/12104978
复制相似问题