Создание задач для параллельного выполнения на лету в Java

У меня есть несколько задач, которые я хочу выполнять параллельно на Java. Я хочу сгенерировать следующую задачу для самостоятельного выполнения на основе данных, которые я собираю в режиме реального времени (в основном это зависит от того, какие другие задачи были завершены и каковы их результаты).

В идеале я ищу исполнителя, построенного так:

new CallbackThreadPoolExecutor(Iterator<Callable<T>> generator)

где я предполагаю, что у генератора есть некоторая внутренняя информация о записи состояния о том, как продвигается выполнение, и на основе этой информации всякий раз, когда вызывается next(), он генерирует следующую задачу.

  • Обратите внимание, что ThreadPoolExecutor требует постановки задач в очередь, но я хочу использовать самую актуальную информацию в то время, когда необходимо принять решение.

  • Вот неуклюжий обходной путь: создайте ThreadPoolExecutor с задачами nThreads, каждая из которых будет вызывать генератор в цикле. Но есть ли более идиоматический/эффективный способ сделать это на Java? (возможно, используя ForkJoinPool?)

  • этот вопрос, похоже, касается связанной проблемы (очень большой список задач) но тут проблема в другом: я хочу принимать решения на лету - и можно предположить, что количество задач не слишком велико (но я могу не знать точное количество задач заранее).

Типичное применение: предположим, что нам дан ориентированный ациклический граф, вершины которого являются задачами, а ребра — зависимостями. Мы можем выполнить задачу только в том случае, если все ее предки выполнили ее. Мы хотим использовать несколько рабочих для обработки всех задач, но, поскольку мы не знаем точно, сколько времени займет каждая задача, мы хотим выбрать следующую задачу для назначения рабочему только тогда, когда рабочий освободится, исходя из максимальной загруженности. -текущее состояние графа (в идеале мы хотим выбрать только задачи, предки которых завершили работу; из них, возможно, мы хотим отдать приоритет задачам, у которых много зависимых).