У меня возникла странная ситуация. Я возился с CompletableFuture
и при выполнении следующего кода у меня есть неожиданные результаты:Вложенные фьючерсы не выполняются
public static void main(String[] args) {
CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<CompletableFuture<Object>>>>>> completableFutureCompletableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("first");
return CompletableFuture.supplyAsync(() -> {
System.out.println("second");
return CompletableFuture.supplyAsync(() -> {
System.out.println("third");
return CompletableFuture.supplyAsync(() -> {
System.out.println("fourth");
return CompletableFuture.supplyAsync(() -> {
System.out.println("fifth");
return CompletableFuture.completedFuture(null);
});
});
});
});
});
completableFutureCompletableFuture.get();
}
Исключение не генерируется (даже при использовании exceptionally
) и то, что я вижу в том, что выход консоли
first
second
third // appears sometimes
Теперь, очевидно, этот код не имеет реальной производственной стоимости, но это представление случая, когда ваш код имеет неизвестное количество гнезд, где каждый или некоторые из них создают CompleteableFutures
, который не будет выполнен.
Любое объяснение (и пример того, как исправить) был бы весьма признателен
Вы, вероятно, не хотят иметь вложенные фьючерсы, как это. Вы должны посмотреть ['thenCompose [Async]()'] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/CompletableFuture.html#thenCompose-java.util .function.Function-). –