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
时创建一个新的 CompletionStage
(CompleteableFuture
实现),他们只提到将结果从旧阶段向前传播到新阶段。
您只能假定这些方法按照文档中的描述进行操作。
您所期望的是从新阶段到旧阶段的反向传播,这显然没有在 javadoc 的任何地方提到,因此您不应该期望首先是行为。
我正在研究 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
时创建一个新的 CompletionStage
(CompleteableFuture
实现),他们只提到将结果从旧阶段向前传播到新阶段。
您只能假定这些方法按照文档中的描述进行操作。
您所期望的是从新阶段到旧阶段的反向传播,这显然没有在 javadoc 的任何地方提到,因此您不应该期望首先是行为。