allOf() ждёт все Future, anyOf() — первый: с ошибками ведут себя по-разному
Этим вопросом проверяют, понимаете ли вы, что allOf и anyOf управляют только моментом завершения, а не агрегацией результатов — сами значения всё равно достаются из исходных CompletableFuture.
allOf(f1, f2) возвращает CompletableFuture и завершается exceptionally, если хотя бы один из futures упал. Значения f1 и f2 после этого читаются отдельными join() или get().
anyOf(f1, f2) завершается с результатом первого завершившегося future — успешного или упавшего. Если первый по времени завершения future упал с исключением, весь anyOf завершится этой ошибкой, даже если второй future через секунду успешно вернул значение.
CompletableFuture f1 = ...; CompletableFuture f2 = ...;
CompletableFuture all = CompletableFuture.allOf(f1, f2);
all.join(); String r1 = f1.join(); String r2 = f2.join();
Что спросят следом: как обработать частичный успех, если один из futures в allOf упал, а второй нормально завершился. Ответ — оборачивать каждый future в handle() до объединения в allOf, чтобы ошибка не убивала весь результат, а превращалась в значение по умолчанию.
allOf и anyOf решают только про момент, когда продолжать выполнение — не про то, что делать с результатами.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки