Java CompletableFuture,何时调用CompletableFuture.handle?
问题1。我的理解是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中没有超时功能。但是
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的信息。无论如何,谢谢你。