Что проверяет вопрос про CompletableFuture.completeAsync()

Метод появился в Java 9: completeAsync(Supplier extends T supplier). Его путают с complete(value), хотя механика разная.

complete(value) устанавливает результат синхронно, в потоке вызывающего кода, и только если future ещё не завершён. completeAsync() планирует вычисление через Supplier асинхронно — в дефолтном executor'е (ForkJoinPool.commonPool()) или в переданном явно — и тоже применяется только к незавершённому future.

Типичный сценарий: посчитать fallback-значение без блокировки вызывающего потока, если основной результат не пришёл вовремя.

CompletableFuture future = new CompletableFuture<>();

future.completeAsync( () -> computeDefault(), executor );

Спросят следом, чем это отличается от obtrudeValue(). obtrudeValue() принудительно перезаписывает результат даже у уже завершённого future — метод существует только для отладки и ломает happens-before гарантии, на которые рассчитывают остальные подписчики future.

Async-суффикс в CompletableFuture почти всегда значит «через executor, не в текущем потоке» — это правило работает одинаково для всех методов цепочки, не только для completeAsync().

Тренажёр: 600 вопросов, мок с таймером, план повторов

senior·base — что спрашивают на самом деле


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