Я не разбираюсь в смысле задачи, поэтому по коду ничего сказать не могу (смущает меня некоторое рекурсивное создание ForkJoinPoolов, которое явно выходит за количество равное 1ому), но есть общее правило. Если у вас вычисления, которые нужно производить на процессоре, то имеет смысл пул задавать равным количеству доступных для JVM ядер. Поэтому, я бы создал 1 ForkJoinPool (дефолтный конструктор делает параллелизм равным количеству ядер), и туда сабмитил таски. а не создавал каждый раз новый пул на каждое дробление (или что там у вас делается).