在这种情况下,有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()可以避免处理已检查的异常。

08-16 12:59