2017-02-16 228 views
2

我有这种情况,其中有10个或更多的任务被分组为多个组。在这些组中,一切都应该同时运行,但是因为每个组都需要前一个组的结果(除了第一个组),我需要按顺序运行它们(组内的任务不需要按顺序运行)。在保持非阻塞状态下,有序地执行了许多CompletableFuture.allof()

任务本身是从数据库查询数据,然后应用一些转换并将其保存回数据库。

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()为了? iteven有可能在这里只使用CompletableFuture

回答

1

当您使用allOf()时,它将返回一个CompletableFuture,只有在完成所有给定完成阶段后才会完成。

如果您从返回的将来连锁呼叫,他们因此可以保证传递给allOf()的任何完成阶段的呼叫get()永远不会阻止(因为它们已经完成)。

// 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()避免检查的异常处理。