Как я могу заставить поток Java выполнять другую задачу, а не блокировать, если блокировка семафора сработает / tryAcquire завершится неудачно? - PullRequest
1 голос
/ 17 февраля 2020

Я изучал параллелизм в java, искал семафоры java и столкнулся с проблемой. У меня есть несколько потоков, пытающихся получить одну из нескольких блокировок для доступа к критическому разделу, защищенному семафором, и хочу, чтобы все мои потоки, которые не смогли получить блокировку, выполнили определенную задачу c, а затем попытались повторно получить блокировку. Каждый раз, когда получение не удается, я хочу, чтобы поток выполнил задачу ожидания, которую я сделал, и когда это будет сделано, попробуйте снова. повторить, пока не приобрел. Глядя на документы java для семафорного класса java, кажется, что все методы получения, так или иначе, выполняют ту или иную форму блокировки. Как я могу выполнить sh то, что я хочу?

1 Ответ

4 голосов
/ 17 февраля 2020

Использование tryAcquire:

while(!done) {
  if(sem.tryAcquire()) {
     // semaphore acquired
     done=true
  } else {
   // Semaphore not acquired, do something else
  }
}

Существует еще один вариант tryAcquire с таймаутом, и вы можете использовать его, если хотите подождать некоторое время, а затем продолжить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...