Упорядоченное выполнение многих CompletableFuture.allof(), оставаясь неблокирующим

У меня есть этот случай, когда есть 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 ответ

Решение

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

Другие вопросы по тегам