Единственный способ выгодно иметь больше потоков, чем реально используемых механизмов исполнения (процессоры или ядра или что-то еще используется - я просто назову их процессорами здесь), это если некоторые потоки действительно ожидают ресурсы, кроме этих процессоров.
Если потоки связаны с процессором, идеальное число эквивалентно количеству процессоров, которые вам доступны. Если многие потоки ожидают файлового ввода-вывода или доступа к базе данных, сетевого трафика или событий ОС (и т. Д.), Тогда пара сотен может быть в порядке. Но в вашем случае это не так.
Пул потоков - это действительно способ избежать непрерывного создания и уничтожения потоков в ситуациях, когда это может быть относительно неэффективно. Например, если запуск потока занимает десять секунд, а каждая из них выполняет только одну секунду, тогда пул потоков будет идеальным.
Учитывая, что вы, вероятно, сократите число потоков до чего-то существенно менее четырехсот (скажем, около двух или четырех), что, в свою очередь, увеличит объем работы, выполняемой каждым, пул потоков может не понадобиться , Но опять же, это зависит от объема работы, выполняемой потоками, по сравнению со стоимостью их запуска.
Чтобы было проще, я бы начал с версии без пула и рассматривал изменение только в случае серьезной проблемы с производительностью. В противном случае вы можете дать себе дополнительную работу без реальной выгоды.
Вы по-прежнему можете разделить свою работу на четыреста единиц, но лучшим подходом будет просто поставить их в очередь и заставить каждый из ваших потоков извлечь элемент из очереди, когда он будет готов обработать его. Таким образом, работа автоматически распределяется между процессорами. Если по какой-то странной причине процессор № 1 работает в два раза быстрее других, он автоматически получит вдвое большую нагрузку.
Это важнее, чем вы думаете, просто потому, что почти наверняка процессоры будут выполнять другие вещи - они вряд ли будут полностью посвящены только выполнению этой работы.