gpt4 book ai didi

Java CompletableFuture,什么时候调用 completableFuture.handle ?

转载 作者:行者123 更新时间:2023-11-30 02:04:26 28 4
gpt4 key购买 nike

Q1。我的理解是,如果 future 正常或异常完成,就会调用 completableFuture.handle 。但是超时情况又如何呢?

第二季度。在哪里检查 completableFuture 的默认超时设置?如何改变呢? future 超时后会发生什么? (完成还是异常?)

第三季度。只要 future “完成”(完成或超时或任何最后阶段),我就需要doSomething()。是否有一种方法可以保证在未来“完成”后被调用?我应该把 doSomething() 放在哪里?

全新的、可完成的 future 。更喜欢 Java 8 的答案。感谢您的帮助。

最佳答案

Java 9 之前的 CompletableFuture 中没有超时功能。但是,由于 CompletableFuture 的基本工作方式,您的问题仍然可以得到解答。

只有两种方法可以完成CompletableFuture,正常(使用值)或异常(使用Throwable)。因此,任何不提供结果值的完成都必须以异常(exception)的方式完成,提供一个可抛出的对象。

因此,取消是通过使用 CancellationException 异常完成 future 来实现的。从 Java 9 开始,超时将通过使用 TimeoutException 异常完成 future 来实现。

这意味着任何阶段都保证在完成时执行,无论是正常还是异常完成,就像与handle链接一样> 或 whenComplete 始终会被执行,无论先决条件阶段因异常而失败、已被取消还是已超时。您必须检查提供的可抛出对象以找出发生了哪些情况。

由于 Java 8 中已存在 TimeoutException,因此您可以对其实现特殊处理。您甚至可以为其实现兼容的触发器,例如通过调度一个操作到 ScheduledExecutorService ,它将在经过一段时间后对您的 future 调用 completeExceptionally​(new TimeoutException()) (请记住,当 future 已经完成)。这与 Java 9 的内置超时机制没有太大不同。

为了解决最后一个打开点,即使在未来的版本中,也没有默认的超时设置。如果您明确请求(提供您预期的超时值),则只会出现超时。

关于Java CompletableFuture,什么时候调用 completableFuture.handle ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51757585/

28 4 0