Thread Interruptded Exception,释放信号量资源

时间:2018-05-22 19:19:15

标签: java multithreading thread-safety

我有三个线程,他们需要一些资源来运行我使用信号量实现的(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等。 你有什么建议吗?谢谢。

2 个答案:

答案 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();
  }
}