Прежде всего, .getNow()
не работает, так как этот метод требует запасного значения в качестве аргумента для случая, когда будущее еще не завершено.Поскольку вы предполагаете, что будущее здесь будет завершено, вы должны также использовать join()
.
. Тогда нет разницы в отношении исчерпания потока, так как в любом случае вы ожидаете завершения всех заданий, прежде чем продолжить, потенциально блокируя текущий поток.
Единственный способ избежать этого - это рефакторинг кода, чтобы не ожидать результата синхронно, а вместо этого запланировать последующее действие обработки, которое будет выполнено, когда все задания будут завершены.Затем использование allOf
становится актуальным:
final List<CompletableFuture<List<Test>>> completableFutures = resolvers.stream()
.map(resolver -> supplyAsync(() -> task.doWork()))
.collect(toList());
CompletableFuture.allOf(completableFutures.toArray(new CompletableFuture<?>[0]))
.thenAccept(justVoid -> {
// here, all jobs have been completed
final List<Test> tests = completableFutures.stream()
.flatMap(completableFuture -> completableFuture.join().stream())
.collect(toList());
// process the result here
});
Кстати, что касается метода toArray
для коллекций, я рекомендовал прочитать Массивы мудрости Древних …