Я работаю над учебником для моего курса по параллелизму Java. Цель состоит в том, чтобы использовать пулы потоков для параллельного вычисления простых чисел.
Дизайн основан на Сите Эратосфена. Он имеет массив из n bools, где n - наибольшее целое число, которое вы проверяете, и каждый элемент в массиве представляет одно целое число. Истина - это простое число, ложь - не простое число, и изначально весь массив является истинным.
Пул потоков используется с фиксированным числом потоков (мы должны поэкспериментировать с количеством потоков в пуле и наблюдать за производительностью).
Потоку дается целое число, кратное процессу. Затем поток находит первый истинный элемент в массиве, который не кратен целому числу потока. Затем поток создает новый поток в пуле потоков, которому присваивается найденный номер.
После формирования нового потока существующий поток продолжает устанавливать для всех кратных его целого числа в массиве значение false.
Основной поток программы начинает первый поток с целого числа '2', а затем ожидает завершения всех созданных потоков. Затем он выплевывает простые числа и время, необходимое для вычисления.
Проблема, с которой я столкнулся, заключается в том, что чем больше потоков в пуле потоков, тем медленнее будет процесс, когда 1 поток будет самым быстрым. Должно быть быстрее, а не медленнее!
Все материалы в Интернете о пулах потоков Java создают рабочие потоки в главном потоке, а затем ждут завершения всех потоков. Метод, который я использую, является рекурсивным, поскольку рабочий может порождать больше рабочих потоков.
Я хотел бы знать, что происходит, и можно ли рекурсивно использовать пулы потоков Java.