从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()答案 0 :(得分:11)
在acquire()?
期间发生InterruptedException时调用release()
你不应该。如果.acquire()被中断,则不会获取信号量,因此很可能不会释放它。
您的代码应为
// use semaphore to limit number of parallel threads
semaphore.acquire();
try {
doMyWork();
}
finally {
semaphore.release();
}
答案 1 :(得分:4)
nos接受的答案部分正确,除了semaphore.acquire()也会抛出InterruptedException。因此,为了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
}
答案 2 :(得分:0)
如果线程在获取方法调用之前被中断,或者在等待获取许可时,将抛出InterruptedException并且不会保留许可,因此不需要释放。只有当您确定获得许可证时(在调用获取方法调用之后),您才需要释放许可证。所以你最好在尝试块开始之前获得,比如:
sem.acquire();
try{
doMyWork();
}finally{
sem.release();
}