Що робить метод orTimeout() в Java 9+
Structured Java interview answer with junior, middle, and senior-level explanation.
🟢 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);
Типові помилки
- Задача продовжує виконуватися: ```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. Як правильно виконати декілька паралельних запитів до мікросервісів]]