CompletableFuture return 完全不同的未来

CompletableFuture return totally different future

我正在研究 Java 8 CompletableFuture(使用 Scala 或 JS 等语言的 Promise)。

可能是我做错了什么或者没有找到任何描述。 return 在其上设置了几个回调后编辑的 Future return 完全独立的 future。

我有一些单元测试:

public class FutureTest {
    private boolean stage1;
    private boolean stage2;

    @Before
    public void setUp() throws Exception {
        this.stage1 = false;
        this.stage2 = false;
    }

    @Test
    public void testCombinationOfCallbacks() throws Exception {
        final CompletableFuture<String> future = new CompletableFuture<>();

        future
            .whenComplete((s, e) -> stage1 = true)
            .whenComplete((s, e) -> stage2 = true);

        future.complete("done");

        assertTrue(stage1);
        assertTrue(stage2);
        assertEquals("done", future.get());
    }

    @Test
    public void testCombinationOfCallbacksCalledOnReturnedFuture() throws Exception {
        final CompletableFuture<String> future = new CompletableFuture<>();

        final CompletableFuture<String> returnedFuture = future
                .whenComplete((s, e) -> stage1 = true)
                .whenComplete((s, e) -> stage2 = true);

        returnedFuture.complete("done");

        assertFalse(future.isDone());
        assertFalse(stage1);
        assertFalse(stage2);
    }
}

正如您在第二个测试中看到的那样,最初创建的未来不受具有回调的未来完成这一事实的影响。所以基本上回调是在创建的未来上设置的,而不是 returning 未来。

这意味着你从来没有做过这样的事情:

private CompletableFuture<String> createFuture() {
    return new CompletableFuture<String>()
        .whenComplete((s, e) -> stage1 = true)
        .whenComplete((s, e) -> stage2 = true);
}

它是否记录在 Java文档中的某处?

javadocs 说的是方法 可以 做什么,而不是他们不能做的无限量的其他事情:

    public CompletionStage<T> whenComplete
    (BiConsumer<? super T, ? super Throwable> action);

Returns a new CompletionStage with the same result or exception
as this stage, and when this stage completes, executes the
given action with the result (or {@code null} if none) and the
exception (or {@code null} if none) of this stage.

@param action the action to perform
@return the new CompletionStage

文档说你在每次调用 whenComplete 时创建一个新的 CompletionStageCompleteableFuture 实现),他们只提到将结果从旧阶段向前传播到新阶段。

您只能假定这些方法按照文档中的描述进行操作。

您所期望的是从新阶段到旧阶段的反向传播,这显然没有在 javadoc 的任何地方提到,因此您不应该期望首先是行为。