Исключение прерывания нити, освобождение ресурсов семафора - PullRequest
0 голосов
/ 22 мая 2018

У меня есть три потока, и им нужны для запуска некоторые ресурсы (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 голосов
/ 22 мая 2018

Вы можете попробовать использовать 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();
  }
}
0 голосов
/ 22 мая 2018

Использовать вложенные try блоки:

try {
    A.acquire(2);
    try {
        B.acquire(2);
        try {
            // some stuff
        } finally {
            B.release(2);
        }
    } finally {
        A.release(2);
    }
} catch (InterruptedException ex) {}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...