Я использую неограниченный кеширующий поток Java-ExecutorService, который одновременно обрабатывает мои задачи.Теперь у меня есть некоторые задачи, которые выполняют только некоторые длительные операции (меньшинство) и некоторые задачи, которые блокируют IO (подключение к URL-адресу, большинство).Если мое приложение запускается и запускается одна рабочая нагрузка, то около 70 задач отправляются исполнителю, который запускает 70 потоков и одновременно обрабатывает все из них.
Я хочу ограничить количество потоков на хост, к которым задача хочет подключитьсяи, если возможно, также количество общих задач.Моя проблема заключается в том, что все задачи выполняют что-то вроде fork-join, поэтому они порождают другие задачи и ждут своего результата, прежде чем продолжить.Это означает, что я не могу просто использовать семафор или ограниченную очередь для каждого хоста, поскольку задачи могут выполнять ветвление других задач, которые не будут обрабатываться, пока у семафора / очереди не будет свободного слота, поэтому приложение заблокировано.
Есть ли какой-нибудь шаблон для решения этой проблемы?
Уточнено : отправлены задачи, связанные с IO (= сетью).После выполнения некоторой работы ввода-вывода они потенциально разветвляют другие задачи, связанные с вводом-выводом, затем присоединяются к ним и, возможно, выполняют дополнительную обработку, связанную с вводом-выводом.
Кажется, что это Fork / Join с задачами, связанными с вводом-выводом.Как ограничить / ограничить выполнение задач, выполняющих ввод-вывод, без взаимной блокировки потока, который изначально разветвлял задачи (заблокирован, поскольку его разветвленные дочерние задачи не будут обработаны из-за ограничений / регулирования)?
Спасибогроздь