Специально для этой цели существует платформа, называемая dexecutor (Отказ от ответственности: я владелец)
Dexecutor - это очень легковесный фреймворк для надежного выполнения зависимых / независимых задач, для этого он предоставляет минимальный API.
- API для добавления узлов в графе (addDependency, addIndependent, addAsDependentOnAllLeafNodes, addAsDependencyToAllInitialNodes. Два более поздних варианта представляют собой гибридную версию первых двух)
- и другие для выполнения узлов по порядку.
Вот самый простой пример:
DefaultDependentTasksExecutor<Integer, Integer> executor = newTaskExecutor();
executor.addDependency(1, 2);
executor.addDependency(1, 2);
executor.addDependency(1, 3);
executor.addDependency(3, 4);
executor.addDependency(3, 5);
executor.addDependency(3, 6);
//executor.addDependency(10, 2); // cycle
executor.addDependency(2, 7);
executor.addDependency(2, 9);
executor.addDependency(2, 8);
executor.addDependency(9, 10);
executor.addDependency(12, 13);
executor.addDependency(13, 4);
executor.addDependency(13, 14);
executor.addIndependent(11);
executor.execute(ExecutionBehavior.RETRY_ONCE_TERMINATING);
Вот как будет построен граф зависимостей
Задачи 1,12,11 будут выполняться параллельно, как только одна из этих задач завершится, будут запущены зависимые задачи, например, скажем, задача 1 завершается, задачи 2 и 3 будут выполняться аналогично, как только задача 12 завершит задачу 13 и т. д.