Мы не знаем, что в syncMethod
, но название, похоже, выбрано для обозначения «некоторого кода синхронной связи», и в этом случае пример кода, который вы показываете, явно является антипаттерном. Я подозреваю, что это не включено в документы по гуаве просто потому, что они никогда не думали, что кто-то напишет это. Это все равно, что сказать людям не объявлять свой метод как возвращающий объект, если он на самом деле всегда возвращает null, или назвать его «doX», если это действительно Y. Подписи обещают поведение, и возвращать обещания будущего, которые вы, по крайней мере иногда, вернуть неполное будущее.
Если у вас есть метод, который иногда задерживает работу, а иногда нет, имеет смысл возвращать законченное будущее по незадержанному пути. Вот несколько рекомендаций:
- Рассмотрите обработку исключений вашего вызывающего: он может ожидать, что определенные типы сбоев приведут к неудачному будущему, и может неправильно обрабатывать ваш метод, вызывая исключение напрямую.
- Не вызывайте напрямую код, который вызывает InterruptedException. Это верный признак того, что вы нарушаете ожидания вызывающего абонента относительно того, являетесь ли вы асинхронным или нет.
- IOException также является красным флагом, поскольку обычно он сопровождает медленные сетевые или дисковые вызовы, которые ваш вызывающий может ожидать, что произойдет асинхронно .
К сожалению, для нет общего решения, как преобразовать ваш синхронный вызов в асинхронный. В идеале вы должны использовать асинхронные библиотеки внутри системы для выполнения сетевых вызовов, чтобы ваши потоки не сидели без дела, собирая пыль, пока байты отскакивают между серверами. Если это не вариант, вам придется увеличить пул потоков - просто следите за тем, сколько потоков вы создаете.