在保持非阻塞的同时,对许多CompletableFuture.allof()进行有序执行

时间:2017-02-16 23:21:55

标签: java java-8 completable-future

我遇到这种情况,其中有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

1 个答案:

答案 0 :(得分:1)

当您使用CompletableFuture时,它会返回get(),只有在完成所有给定的完成阶段后才会完成。{/ p>

如果您从返回的未来链接调用,则可以保证在传递给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 ); 的调用永远不会阻止(因为它们已经完成)。< / p>

join()

注意:使用get()代替 DataRow totalRow = dt.NewRow(); totalRow["ColumnName"] = "Column Total"; dt.Rows.Add(totalRow); 来避免处理已检查的例外。