Что проверяет вопрос про orTimeout() у CompletableFuture
Асинхронная цепочка может зависнуть не из-за ошибки, а из-за молчания: downstream не ответил, exceptionally() не сработает, потому что exception не был выброшен — просто нет завершения. До Java 9 таймаут делали руками: отдельный ScheduledExecutorService, который дёргает complete() или completeExceptionally() по расписанию.
orTimeout(long timeout, TimeUnit unit) и completeOnTimeout(T value, long timeout, TimeUnit unit) закрывают эту потребность в стандартной библиотеке. orTimeout заводит таймер и завершает future исключением TimeoutException, если результата не было к сроку. completeOnTimeout вместо исключения подставляет заглушку — удобно для fallback-значения без отдельного exceptionally().
CompletableFuture future = supplyAsync(() -> callDownstream()) .orTimeout(500, TimeUnit.MILLISECONDS) .exceptionally(ex -> "fallback");
Спросят следом: что происходит с самим вызовом внутри supplyAsync после срабатывания таймаута. Ответ — ничего: future завершится исключением, но поток, выполняющий callDownstream(), не остановится, пока метод не вернёт управление сам. Таймаут на Future — это не таймаут на код внутри задачи.
Финал: orTimeout меняет состояние future, а не поведение задачи, которая его заполняет.
Тренажёр: 600 вопросов, мок с таймером, план повторов
senior·base — что спрашивают на самом деле
В этом посте были ссылки, но мы их удалили по правилам Сетки