gpt4 book ai didi

java - 如果手动完成,则不会调用 CompletableFuture 回调

转载 作者:行者123 更新时间:2023-12-04 08:05:03 73 4
gpt4 key购买 nike

的这个基本示例中CompletableFuture ,我异步运行一个任务,当它完成时,应该触发一个异步回调。
在我开始运行任务后一秒钟,在它完成之前,我完成了它。之后,我不再看到它运行异步回调。

public static void main(String[] args) throws InterruptedException {
runTask();
Thread.sleep(1000);
completableFuture.complete("Test");
Thread.sleep(4000);
}

public static void runTask() {
completableFuture = CompletableFuture.supplyAsync(() -> {
System.out.println("Running...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("...finished");
return "finished task";
})
.thenApplyAsync(s -> {
System.out.println("Apply on result: " + s);
return "Result: " + s;
})
}
这样做的结果是:
Running...
...finished
问题是如果我添加另一个回调,那么它会运行第一个而不是第二个。
.thenApplyAsync(s -> {
System.out.println("Second apply with result: " + s);
return "Result: " + s;
})
那么结果是:
Running...
...finished
Apply on result: finished task
阅读文档我明白所有的回调都会被调用,即使 future 是手动完成的。我在这里错过了什么吗?

最佳答案

我想如果你写的略有不同,它应该是有道理的:

public static void runTask() {

CompletableFuture<String> one = CompletableFuture.supplyAsync(() -> {
System.out.println("Running...");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("...finished");
return "finished task";
});

CompletableFuture<String> two = one.thenApplyAsync(s -> {
System.out.println("Apply on result: " + s);
return "Result: " + s;
});

completableFuture = two;
}
所以, one在你的情况下开始就好了,但在 two 之前甚至可以开始,你发出 completableFuture.complete("Test"); .所以当 one大功告成,无事可做 thenApplyAsync ,因为那个已经完成了。
当您再添加一个阶段时,您基本上会得到:
....
CompletableFuture<String> two = one.thenApplyAsync(s -> {
System.out.println("Apply on result: " + s);
return "Result: " + s;
});

CompletableFuture<String> three = two.thenApplyAsync(s -> {
System.out.println("Second apply with result: " + s);
return "Result: " + s;
});

completableFuture = three;
你可能会看到这里发生了什么,甚至不需要我解释。

为此,我看不到文档在哪里可以清楚地说明这一点。我想我们需要在 package documentation 中看到它, 通过:

When two or more threads attempt to complete, completeExceptionally, or cancel a CompletableFuture, only one of them succeeds.


这在某种程度上意味着如果某个阶段尚未开始,而是其他人,外部 complete它;那个阶段根本不会运行。这是有道理的,但包文档可能更清楚,imo。

关于java - 如果手动完成,则不会调用 CompletableFuture 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66250511/

73 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com