Уведомление о задержке для получения блокировки в Java - PullRequest
2 голосов
/ 11 октября 2011

У нас есть случай использования, когда нам нужно получить блокировку и отправить уведомление, если получение блокировки занимает более 5 минут.Мы все еще должны ждать блокировки вечно.

Мы используем повторные входящие блокировки, и lock.tryLock (5, TimeUnit.Minutes) недостаточно, поскольку он выходит через 5 минут.

Опция, которую мы попробовали, была:

while(!lock.tryLock(5, TimeUnit.minutes)) {
    // send notification
}

Но я думаю, это привело бы к потере справедливости блокировки (порядок, в котором запрашивается блокировка)

Кто-нибудь сталкивалсяв таких случаях использования, если да, пожалуйста, объясните, как это было решено.

Мы предпочитаем не иметь ручного решения о поддержании блокировок и соответствующей метаинформации потока ожидания (например, когда он был инициирован для получения блокировки)некоторый контекст и другой поток непрерывно опрашивают весь этот контекст, чтобы узнать, есть ли у него потоки ожидания, ожидающие более 5 минут.

1 Ответ

4 голосов
/ 11 октября 2011

Настройка службы ScheduledExecutorService.Прежде чем получить блокировку, запланируйте задачу на 5 минут и сохраните будущее.Когда блокировка получена, отмените Future.

ScheduledExceutorService ses;
Future f = ses.schedule(new Runnable(){...}, 5, TimeUnit.Minutes);
lock.lock();
f.cancel();

Если вы приобрели блокировку до того, как отправленная задача была выполнена, ее следует отменить.

...