线程中断异常,释放信号量资源



>我有三个线程,它们需要一些资源来运行(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,那么在 final 块中我会再次释放 A 等。 你有什么建议吗?谢谢。

使用嵌套try块:

try {
A.acquire(2);
try {
B.acquire(2);
try {
// some stuff
} finally {
B.release(2);
}
} finally {
A.release(2);
}
} catch (InterruptedException ex) {}

你可以尝试使用这样的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();
}
}

最新更新