Java CompletableFuture,何时调用CompletableFuture.handle?

Java CompletableFuture,何时调用CompletableFuture.handle?,java,java-8,completable-future,Java,Java 8,Completable Future,问题1。我的理解是completableFuture。如果future正常或异常完成,则调用handle。但是超时场景呢 问题2。在何处检查completableFuture的默认超时设置?如何改变它?未来超时后会发生什么?(完成还是例外?) 第三季度。我需要doSomething()。是否有一种方法保证在将来“完成”后调用?我应该把doSomething()放在哪里 全新的未来。更喜欢使用Java8的答案。感谢您的帮助。在Java 9之前的CompletableFuture中没有超时功能。但是

问题1。我的理解是
completableFuture。如果future正常或异常完成,则调用handle
。但是超时场景呢

问题2。在何处检查completableFuture的默认超时设置?如何改变它?未来超时后会发生什么?(完成还是例外?)

第三季度。我需要
doSomething()。是否有一种方法保证在将来“完成”后调用?我应该把
doSomething()
放在哪里


全新的未来。更喜欢使用Java8的答案。感谢您的帮助。

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

只有两种方法可以完成
CompletableFuture
,正常情况下(使用值)或例外情况下(使用
Throwable
)。因此,任何不提供结果值的完成都必须在例外情况下完成,提供一次性的结果

因此,通过使用
CancellationException
来完成未来的异常操作,可以实现取消。从Java9开始,超时将通过使用
TimeoutException
完成未来异常工作

这意味着,无论是正常完成还是异常完成,保证在完成时执行的任何阶段,如用
句柄链接的
或在完成时链接的
都将始终执行,无论先决条件阶段是否因异常而失败、是否已取消或超时。您必须检查提供的throwable,以了解发生了哪些情况

由于Java 8中已经存在
TimeoutException
,因此您已经可以对其实现特殊处理。您甚至可以为它实现一个兼容的触发器,例如,通过将操作调度到
ScheduledExecutorService
,该服务将异常地调用
completeet​(new TimeoutException())
在经过一段时间后对您的未来进行评估(请记住,当未来已经完成时,这将被忽略)。这与Java9的内置超时方式没有太大区别


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

我认为您对超时有误解。超时不是发生在未来的事情。这是等待它的线程发生的事情。但是,您可以阅读@shmosel,感谢您指出。我没有考虑线程超时。我认为CompletableFuture对象本身会有一些超时值。@zlakad这看起来像我想要的,只是它是java 10,我正在尝试了解更多关于java 8的信息。无论如何,谢谢你。