Java 9 中 orTimeout() 和 completeOnTimeOut() 方法的区别

10 Sept 2024 | 4 分钟阅读

Java 9 引入了多项新功能和增强功能,以进一步提升语言的能力。这些新增功能包括 orTimeout()completeOnTimeout() 方法,旨在增强 CompletableFuture 实例的超时处理能力。这些方法为开发人员在处理可能超出预期时间的异步任务时提供了更多的控制和灵活性。

在本节中,我们将深入探讨 orTimeout() 和 completeOnTimeout() 方法的区别,审视它们的目的、行为和使用场景。

orTimeout() 与 completeOnTimeout() 方法

方面orTimeout() 方法completeOnTimeout() 方法
目的引入 CompletableFuture 的超时机制。提供基于超时的完成机制。
行为如果在超时时间内未获得结果,则抛出 TimeoutException。如果在超时时间内未获得结果,则以默认值完成。
原始状态更改不改变原始 CompletableFuture 的状态。改变原始 CompletableFuture 的状态。
处理超时通过处理异常来响应超时。触发替代流程,而不引发异常。
用例适用于超时意味着重大问题的场景。适用于可以预期超时并需要处理的情况。
示例用法网络请求,其中超时表示存在问题。实时仪表板,在超时时显示缓存数据。
异常处理抛出异常提供值替换
如何处理超时抛出 TimeoutException,需要使用 try-catch 或异常传播来捕获和处理。以默认值完成,可以直接使用,无需异常处理。
原始 Future 状态不受影响已更改
对初始 CompletableFuture 的影响不修改原始 CompletableFuture 实例;超时行为是外部添加的。通过默认值完成来修改原始 CompletableFuture 的状态。
异常类型TimeoutException无新异常类型
为超时引入的异常类型引入一种 TimeoutException 类型,专门用于处理由此方法引起的超时。此方法不引入新的异常类型。
对 Completion Stage 的依赖附加到 CompletableFuture。独立于 Completion Stage。
方法附加要求需要一个初始 CompletableFuture 来附加 orTimeout() 方法。可独立用于任何 CompletableFuture 实例。
CompletableFuture 创建创建新的 CompletableFuture。修改现有的 CompletableFuture。
创建替代 CompletableFuture如果发生超时,您可能需要创建一个新的 CompletableFuture 来处理替代流程。在超时时更改现有 CompletableFuture 的内容和状态。
超时时的值不适用超时时的值
指定超时值不提供在 CompletableFuture 超时时指定值的途径。允许指定一个默认值,以便在发生超时时使用该默认值完成 CompletableFuture。
链式调用和管道适用于管道。不太适用于管道。
管道支持可能更适合链式调用和组合多个 CompletableFuture 操作。已更改的状态可能不适合多个 CompletableFuture 操作的平滑管道。
超时异常处理的灵活性有限的灵活性备用值自定义
自定义超时时的异常处理提供一种特定的异常类型 (TimeoutException),用于区分处理超时。允许根据应用程序的需求自定义备用值。
超时时的自定义操作有限的自定义操作超时时的自定义操作
定义超时的其他操作超时时的主要操作是抛出 TimeoutException。自定义此行为的能力有限。当发生超时时,提供了更大的灵活性来定义其他操作,包括提供备用值。
超时对 Future 完成的影响对完成无影响。潜在的提前完成。
对完成时间的影响超时处理不影响原始 CompletableFuture 的完成。一旦达到超时时间,就以默认值完成 CompletableFuture,这可能导致提前完成。

orTimeout() 方法的使用

OrTimeoutExample.java

输出

Task did not complete within the specified timeout. 

completeOnTimeout() 方法的使用

CompleteOnTimeoutExample.java

输出

Fallback: Task did not complete within the specified timeout.

结论

在 Java 9 中,orTimeout() 和 completeOnTimeout() 方法的引入为涉及超时的 CompletableFuture 处理带来了宝贵的增强。理解这些方法之间的区别对于有效管理异步操作至关重要。通过恰当地使用这些方法,开发人员可以创建更健壮、响应更快的应用程序,这些应用程序能够优雅地处理超时,而不会牺牲用户体验。


下一个主题Java 数组的缺点