我有三个线程,它们需要运行一些使用信号量实现的资源(A,B,C)。
public void run(){
while(!Thread.currentThread().isInterrupted){
try{
A.acquire(2);
B.acquire(2);
//some-stuff
}
catch(InterruptedException ex){}
finally{
A.release(2); //PROBLEM
B.release(2);
}
}
问题:运行时,线程可能会中断,但是进入
finally
方法时,我不知道中断期间我在哪里,所以我不知道是否必须释放某些内容。我尝试了很多不同的实现,例如使用
(boolean) tryAcquire()
方法,但是又出现了另一个问题:如果我获得资源A而不是资源B,那么在finally块中,我将再次释放A等。你有什么建议吗?谢谢你。
最佳答案
您可以尝试像这样使用List
:
List<Semaphore> acquired = new ArrayList<>(2);
while(!Thread.currentThread().isInterrupted) {
try{
A.acquire(2);
acquired.add(A);
B.acquire(2);
acquired.add(B);
//some-stuff
} catch(InterruptedException ex){}
finally{
for (Semaphore s : acquired) {
s.release(2);
}
s.clear();
}
}