2017-02-16 5 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() на заказ? Можно ли здесь использовать только CompletableFuture?

ответ

1

Когда вы используете 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(), чтобы избежать обработки проверяемых исключений.

Смежные вопросы