Предполагая, что обработка ЦП будет основным узким местом вашей системы, количество потоков для обработки ЦП должно быть, по крайней мере, установлено равным количеству доступных ЦП или ядер.
Часть ввода / вывода, вероятно, вообще не будет использовать много ЦП, но вы можете выделить фиксированный пул из нескольких потоков (равный или меньший, чем количество ядер), чтобы предотвратить переключение контекста избыточного потока одновременные потоки ввода / вывода.
Вы также можете установить число потоков для обработки ЦП немного большим, чем количество ядер, если потоки обработки ЦП не всегда используют 100% ЦП от начала до конца. Например, если они могут выполнить некоторые операции ввода-вывода или получить доступ к некоторому общему ресурсу во время обработки.
Но, как и в любой системе, идеальное количество потоков будет сильно зависеть от характера вашей программы. Вы можете использовать такие инструменты, как JVisual VM (в комплекте с JDK), чтобы проанализировать, как потоки используются в вашей программе, и попробовать различные варианты настройки потоков.