[英]Java CompletableFuture, when is completableFuture.handle called?
Q1。 我的理解是completableFuture.handle
,如果将来正常或异常完成,则会调用该方法。 但是超时情况如何?
Q2。 在哪里检查completableFuture的默认超时设置? 怎么改变呢? 将来超时后会怎样? (完成还是例外?)
Q3。 只要将来是“完成”(完成或超时或任何最后阶段),就需要doSomething()
)。 有没有保证在“完成”以后调用的方法? 我应该把doSomething()
放在哪里?
可完成的未来的新事物。 首选Java 8的答案。谢谢您的帮助。
Java 9之前的CompletableFuture
没有超时功能。但是,由于CompletableFuture
基本工作方式,您的问题仍然可以回答。
通常只有两种方法可以完成CompletableFuture
,通常是(带有值)或例外地(带有Throwable
)。 因此,任何不提供结果值的完成操作都必须例外地进行,并提供可抛出的结果。
因此,取消可以通过使用CancellationException
异常完成未来来实现。 从Java 9开始,超时将通过TimeoutException
异常完成未来来实现。
这意味着无论在哪种情况下都能保证在正常或异常完成时执行的任何阶段(如与handle
或whenComplete
链接)总是会被执行,无论前提阶段是否因异常而失败,已被取消或超时过去。 您将必须检查提供的throwable,以找出发生了哪些情况。
由于TimeoutException
在Java 8中已经存在,因此您已经可以对其进行特殊处理。 您甚至可以为其实现一个兼容的触发器,例如,通过安排一个ScheduledExecutorService
的动作,该动作将在经过一段时间后在您的将来调用completeExceptionally(new TimeoutException())
(请注意,当将来已经存在时将忽略此动作)完成)。 这与Java 9的内置超时没有什么不同。
为了解决最后的开放点,即使在将来的版本中,也没有默认的超时设置。 如果明确请求超时(提供预期的超时值),则只有一个超时。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.