在这种情况下,有10个或更多任务被分为许多组。在这些组中,所有内容应同时运行,但是由于每个组都需要前一组的结果(第一组除外),因此我需要以有序的方式运行它们(组中的任务不需要按顺序运行)。
任务本身就是从数据库查询数据,然后进行一些转换并将其保存回数据库。
Task 1.1 // This group run first
Task 1.2
Task 2.1 // Waiting results from group 1
Task 2.2
Task 2.3
Task 3.1 // Waiting results from group 2
我当时想使用
allOf()
列表,对其进行迭代,然后为每个get()
显式调用allOf()
,但是它将阻止我不希望发生的事情,所以我的问题是,如何按顺序执行许多allOf()
?在这里甚至可以只使用CompletableFuture
吗? 最佳答案
当您使用allOf()
时,它返回的CompletableFuture
仅在所有给定的完成阶段均完成时才完成。
如果您链接来自返回的将来的呼叫,则可以保证在传递给get()
的任何完成阶段对allOf()
的调用都不会阻塞(因为它们已经完成)。
// First group
CompletableFuture<Integer> task11 = CompletableFuture.supplyAsync(() -> 1);
CompletableFuture<Integer> task12 = CompletableFuture.supplyAsync(() -> 42);
CompletableFuture<Integer> task13 = CompletableFuture.supplyAsync(() -> 1729);
// this one will complete after all tasks from the first group complete
CompletableFuture<Void> allFirstTasks = CompletableFuture.allOf(task11, task12, task13);
// Second group will be child tasks from the first group
CompletableFuture<Integer> task21 = allFirstTasks.thenApply(__ ->
task11.join() + task12.join() + task13.join() // will not block
);
注意:使用
join()
而不是get()
可以避免处理已检查的异常。