我有两个完整的未来。task2只能在task1完成后启动。然后,我需要等待所有任务完成。在我下面的代码中,程序在task1结束后结束。任务2开始,但没有完成。你知道为什么会这样吗?另外,为什么列表只包含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
2条答案
按热度按时间2cmtqfgy1#
你有两个问题。
首先,你已经创建了一个关于什么时候比赛的条件
task2
被添加到你的未来列表中。在你执行这行的时候--我称之为终结者,你只有
task1
在列表中。通过输出其大小自行查看:try {
Thread.sleep(6000L);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
// wait for the calls to finish
try {
System.out.println("# of futures: " + futures.size()); // 2
task1.thenRun( ignore -> {
public static void testFutures () throws Exception {
}
task1 start
task1 done
task2 start
task2 done
all tasks done
643ylb082#
让我们先清理代码。
让我们定义一个方法来进行睡眠,这样它就不会弄脏水了:
然后,让我们将任务分开并使用适当的方法:
你得明白
CompletableFuture
方法已经完全按照您的要求执行了,它们将在上一个阶段结束后运行下一个阶段。您可以使用以下工具使代码更加简单: