您可以使用CompletableFuture链接运行块,如下所示:

CompletableFuture
    .supplyAsync(block1)
    .thenApply(block2)
    .thenApply(block3)...


我的函数返回一个带有2个块的CompletableFuture,因此用户可以根据需要继续链接更多。

public CompletableFuture foo() {
    return CompletableFuture
               .supplyAsync(block1).
               .thenApply(block2);
}


用户可以这样使用:

foo().thenApply(block3).join();


我想在我的方法中添加.exceptionaly()处理程序(因此用户看不到它),但是如果我的任何块出现故障,它都可能破坏链和任何可能的用户链!换句话说-如果block1block2失败,我不想继续他可以链接到block3的返回值的任何可能的用户块(foo)。

额外的问题:Java世界中还有什么比CompletableFuture更好的东西吗?

最佳答案

没有任何理由可以这样做。很简单,因为thenAsync可能会更改返回值的类型值(从CompletableFuture<A>CompletableFuture<B>),并且在方法foo中我们不知道用户将添加什么块。

因此,这种想法不是自然的,也不是期货如何运作。

关于java - 打破CompletableFutures链,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31419235/

10-14 18:25