Я работаю над проблемой, где у меня есть List<ListenableFuture<T>>
.Я хотел бы объединить результаты всех этих фьючерсов в List<T>
с таймаутом.Наивный подход будет выглядеть примерно так:
List<T> blockForResponses(List<ListenableFuture<T>> futures, long timeoutMillis) {
return futures.stream()
.map(future -> future.get(timeoutMillis,TimeUnit.MILLISECONDS)
.collect(Collectors.toList());
}
Это не работает, потому что он ожидает тайм-аут для каждого будущего, и я хочу, чтобы это был тайм-аут для всего списка.Отслеживание того, сколько времени прошло, также не работает, потому что, если первый раз выйдет, у него не останется времени, чтобы попробовать другие.
Решение, которое я ищу, приведет в исполнениетайм-аут на все фьючерсы и возврат по истечении этого времени или по завершении всех фьючерсов в списке.Затем я мог бы самостоятельно проверить каждое будущее в списке, чтобы собрать результаты и проверить, какие из них истекли.