Питання 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. Як правильно виконати декілька паралельних запитів до мікросервісів]]