Вопрос 22 · Раздел 19

Что делает метод orTimeout() в Java 9+

Structured Java interview answer with junior, middle, and senior-level explanation.

Версии по языкам: English Russian Ukrainian

🟢 Junior Level

orTimeout() — завершает CompletableFuture с TimeoutException, если он не завершился за указанное время.

CompletableFuture<String> cf = fetchDataAsync();

// 5 секунд таймаут
cf.orTimeout(5, TimeUnit.SECONDS)
  .thenAccept(result -> System.out.println(result))
  .exceptionally(ex -> {
      // TimeoutException если не успел за 5 секунд
      System.out.println("Timeout!");
      return "fallback";
  });

🟡 Middle Level

Как работает

cf.orTimeout(5, TimeUnit.SECONDS);

// Если cf завершился за 5 секунд — OK
// Если нет — CF завершается с TimeoutException

completeOnTimeout — альтернатива:

// orTimeout — исключение при таймауте
cf.orTimeout(5, TimeUnit.SECONDS);

// completeOnTimeout — fallback значение при таймауте
cf.completeOnTimeout("default", 5, TimeUnit.SECONDS);

Типичные ошибки

  1. Задача продолжает выполняться: ```java cf.orTimeout(5, TimeUnit.SECONDS);

// CF завершается с TimeoutException // Но задача в executor продолжает работать!


---

## 🔴 Senior Level

### Internal Implementation

```java
public CompletableFuture<T> orTimeout(long timeout, TimeUnit unit) {
    if (result == null)
        whenComplete(timeoutFuture(timeout, unit));
    return this;
}

// Использует ScheduledExecutorService для отложенного завершения

Performance

orTimeout overhead:
(Java 21, single-threaded benchmark). Для сравнения: типичный HTTP-вызов
занимает 10-100ms, так что оверхед таймаута (~1μs) составляет менее 0.01%.

Best Practices

// ✅ orTimeout для Java 9+
cf.orTimeout(5, TimeUnit.SECONDS);

// ✅ completeOnTimeout для fallback
cf.completeOnTimeout(defaultValue, 5, TimeUnit.SECONDS);

// ❌ Ожидание что задача отменится
// ❌ Таймаут без обработки TimeoutException

🎯 Шпаргалка для интервью

Обязательно знать:

  • orTimeout(timeout, unit) — завершает CF с TimeoutException при превышении времени
  • completeOnTimeout(value, timeout, unit) — альтернатива с fallback значением
  • Использует ScheduledExecutorService internally для отложенного завершения
  • Timeout НЕ отменяет задачу — она продолжает работать в executor
  • whenComplete(cancel) при нормальном завершении отменяет scheduled задачу

Частые уточняющие вопросы:

  • orTimeout отменяет задачу в executor? — Нет, CF завершается, задача продолжает работать
  • orTimeout vs completeOnTimeout? — orTimeout бросает TimeoutException, completeOnTimeout возвращает fallback
  • orTimeout overhead? — ~1μs, пренебрежимо мал по сравнению с HTTP вызовом (10-100ms)
  • Java 8 альтернатива? — ScheduledExecutorService + anyOf(cf, timeoutCF)

Красные флаги (НЕ говорить):

  • «orTimeout останавливает задачу» — только завершает CF, задача работает
  • «orTimeout для Java 8» — доступен только с Java 9
  • «TimeoutException можно игнорировать» — нужен fallback или retry

Связанные темы:

  • [[20. Как реализовать timeout для CompletableFuture]]
  • [[10. Что делает метод anyOf() и в каких случаях он полезен]]
  • [[27. Как реализовать retry логику с помощью CompletableFuture]]
  • [[16. Как правильно выполнить несколько параллельных запросов к микросервисам]]