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 — что спрашивают на самом деле


В этом посте были ссылки, но мы их удалили по правилам Сетки