gpt4 book ai didi

java - CompletableFuture.allOf 已完成,即使其列表中的一个 CompletableFuture 尚未完成

转载 作者:行者123 更新时间:2023-12-02 02:31:05 30 4
gpt4 key购买 nike

我有 2 个 CompletableFuture。 task2 只能在 task1 完成后启动。然后,我需要等待所有任务完成。在下面的代码中,程序在 task1 结束后结束。 task2 开始但未完成。有什么想法为什么会发生这种情况吗?另外,为什么列表只包含 1 个条目,而在代码中我添加了 2 个条目?

代码:

public void testFutures () throws Exception {
List<CompletableFuture<Void>> futures = new ArrayList<>();
CompletableFuture<Void> task1 = CompletableFuture.supplyAsync( () -> {
System.out.println(" task1 start");
try {
Thread.sleep(5000L);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println(" task1 done");
return null;

});

task1.whenComplete( (x, y) -> {
CompletableFuture<Void> task2 = CompletableFuture.supplyAsync( () -> {
System.out.println(" task2 start");
try {
Thread.sleep(2000L);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
System.out.println(" task2 done");
return null;
});
futures.add(task2);
});
futures.add(task1);
// wait for the calls to finish
try {
CompletableFuture.allOf(futures.toArray(new CompletableFuture[futures.size()])).whenComplete( (x, y) -> {
System.out.println(" all tasks done " + futures.size());
}).get();

} catch (Exception e) {
e.printStackTrace();
}
}

输出:

 task1 start
task1 done
all tasks done 1
task2 start

最佳答案

让我们首先清理您的代码。

让我们定义一个方法来进行 sleep ,这样它就不会搅浑水:

private static void sleep(int seconds) {
try {
Thread.sleep(TimeUnit.SECONDS.toMillis(seconds));
} catch (InterruptedException ex) {
throw new RuntimeException(ex);
}
}

然后让我们分开任务并使用正确的方法:

private static CompletableFuture<Void> task1() {

return CompletableFuture.runAsync(() -> {
System.out.println(" task1 start");
sleep(5);
System.out.println(" task1 done");
});
}

private static CompletableFuture<Void> task2() {
return CompletableFuture.runAsync(() -> {
System.out.println(" task2 start");
sleep(2);
System.out.println(" task2 done");
});
}

您需要了解 CompletableFuture 方法的链接已经完全符合您的要求,它们在上一个阶段之后运行下一个阶段结束了。您可以使用以下方法使您的代码变得更加简单:

public static void main(String[] args) throws Exception {
testFutures();
}

private static void testFutures() throws Exception {

CompletableFuture<Void> both = task1().thenCompose(ignoreMe -> task2());
both.get();
System.out.println("both done");

}

关于java - CompletableFuture.allOf 已完成,即使其列表中的一个 CompletableFuture 尚未完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65016069/

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