我有三个线程,他们需要一些资源来运行我使用信号量实现的(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等。
你有什么建议吗?谢谢。
答案 0 :(得分:1)
使用嵌套的try
块:
try {
A.acquire(2);
try {
B.acquire(2);
try {
// some stuff
} finally {
B.release(2);
}
} finally {
A.release(2);
}
} catch (InterruptedException ex) {}
答案 1 :(得分:0)
您可以尝试使用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();
}
}