Я наткнулся на ситуацию, когда мне приходится иметь дело с InterruptedException
, но я не могу передать его вверх и не чувствую, что мой код должен его проглотить. Если быть точным, я работаю над реализацией распределенной блокировки, и запрос к резервной службе может быть прерван или даже истечен по времени — и, конечно, java.util.concurrent.Lock
не учитывает такие случаи и не позволяет мне выплевывать InterruptedException . Я изо всех сил пытаюсь написать правильную реализацию для методов lock()
, tryLock()
и unlock()
без выбрасывания.
Итак, вопрос в том, что было бы правильной стратегией для обработки такого случая? С текущей точки зрения я вижу только три варианта (и чувствую запах каждого из них):
- Игнорировать прерванное исключение в методах
lock
/tryLock
/unlock
, повторяя попытку/возвращая false/предполагая, что даже если запрос не дошел до адресата, TTL в конечном итоге разблокирует запись. Это явно не лучшее решение, потому что оно надеется на то, что все будет хорошо, а не на решение проблем. - Заверните в
RuntimeException
наследника. Это также кажется ужасным решением, поскольку клиентскому коду придется работать с конкретной реализацией, а не с исходным интерфейсом, и непроверенное исключение, конечно, не было сделано для такой цели. - Используйте вызов
forceThread.currentThread().interrupt()
. Мне не нравится этот способ, потому что он в основном говорит потоку обработать свое собственное прерывание, а не передавать уведомление о прерывании вызова; также, насколько я понимаю, если нет внешнего опроса, он в конце концов сделает поток, а не мгновенно обработает прерывание, возможно, совсем в другом месте.
(И, конечно, есть возможность разрешить клиентскому коду настраивать желаемое поведение, но это все равно не дает мне действительно хорошего решения)
Есть ли лучший способ, чем я описал? И если нет, то какой из них следует предпочесть другим?