Java 19 的 orTimeout 是 CompletableFuture 的声明式超时机制,超时后以 TimeoutException 完成 future,不取消底层任务,适用于网络请求等场景,与 completeOnTimeout 语义不同。

Java 19 引入的 orTimeout 是 CompletableFuture 中一种简洁、声明式的超时控制机制,它能在任务执行超过指定时长时主动中断并抛出 TimeoutException,无需手动管理线程或定时器。
orTimeout 的核心行为
调用 orTimeout(long timeout, TimeUnit unit) 后,CompletableFuture 会在内部启动一个延迟任务:若原始异步操作未在指定时间内完成,则强制以 TimeoutException 完成该 future。注意以下关键点:
- 它不主动取消底层任务(如线程或 Executor 中正在运行的 Runnable),仅改变 future 的完成状态;若需真正终止执行,应配合
completeOnTimeout+ 手动取消逻辑,或使用可中断的任务(如封装为FutureTask并调用cancel(true)) - 超时判断基于系统时钟(
System.nanoTime()),精度高,但不保证绝对准时(受 JVM 调度影响) - 一旦触发超时,后续对同一 future 的
complete、completeExceptionally等方法调用将被忽略
典型使用场景与写法
适用于 I/O 密集型、网络请求、外部服务调用等不可控耗时的操作。例如:
// 模拟一个可能延迟的 HTTP 请求
CompletableFuture<string> response = CompletableFuture.supplyAsync(() -> {<br>
Thread.sleep(3000); // 实际可能是 HttpClient.send()<br>
return "success";<br>
}, executor)<br>
.orTimeout(2, TimeUnit.SECONDS); // 2 秒内未完成则失败</string>
此时若 sleep 超过 2 秒,future 将以 TimeoutException 完成,下游可通过 exceptionally 或 handle 捕获处理:
.exceptionally(t -> {<br>
if (t instanceof TimeoutException) return "fallback result";<br>
else throw new RuntimeException(t);<br>
});
与 completeOnTimeout 的区别
orTimeout 和 completeOnTimeout 都设超时,但语义不同:
-
orTimeout:纯超时信号,失败即失败,不提供默认值;适合“必须严格限时,超时即报错”的强约束场景 -
completeOnTimeout(U value, long timeout, TimeUnit unit):超时后以指定默认值完成 future;适合“尽力而为,超时给兜底”的柔性策略
二者不可同时使用在同一 future 上(后者会覆盖前者的效果),应按业务容忍度选择。
注意事项与常见陷阱
实际使用中需留意:
- 超时时间应略大于任务预期最大耗时,避免因系统负载抖动误触发
- 若任务本身不可中断(如阻塞式 IO、无响应的 native 调用),
orTimeout只能控制 future 状态,无法释放资源;此时建议改用带中断支持的异步 API(如 Netty、HttpClient 5 的异步模式) - 不要在同一个 future 上重复调用
orTimeout,多次设置会覆盖前一次,且无警告 - 测试超时逻辑时,建议用
CompletableFuture.delayedExecutor模拟可控延迟,而非依赖真实 sleep










