Есть ли простой способ превратить Future > в Future ?
-
24-09-2019 - |
Вопрос
У меня есть код, который отправляет запрос в другой поток, который может или не может отправить этот запрос в другой поток.Это дает возвращаемый тип кода Future<Future<T>>
.Есть ли какой-нибудь не отвратительный способ немедленно превратить это в генерирующий кодовый код, ожидающий завершения всей будущей цепочки?
Я уже использую библиотеку Guava для обработки других забавных вещей, связанных с параллелизмом, а также в качестве замены коллекций Google и ее хорошей работы, но я не могу найти что-то для этого случая.
Решение
Guava 13.0 добавляет Futures.dereference
для этого.Для этого требуется общий кодовый код, а не простой общий кодовый код.(Для работы с простым ListenableFuture<ListenableFuture>
потребуется вызов makeListenable, для каждого из которых требуется выделенный поток на время существования задачи (что становится понятнее благодаря новому имени метода Future<Future>
)
Другие советы
Еще одна возможная реализация, использующая библиотеки guava, и она намного проще.
родовое словоЯ считаю, что это лучшее, что можно сделать для реализации контракта Future.Я поступил максимально неумно, чтобы убедиться, что это соответствует условиям контракта.Не особенно реализация get с таймаутом.
родовое словоВы можете создать такой класс:
родовое словоВам придется иметь дело с исключениями, которые get () может вызывать, а другие методы - нет.
Это был мой первый удар, но я уверен, что в этом есть много неправильного.Я был бы более чем счастлив просто заменить его чем-нибудь вроде Futures.compress(f)
.