Что делает метод 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. Как правильно выполнить несколько параллельных запросов к микросервисам]]