Что проверяет вопрос про 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 — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки