Другие ответы, конечно, правильные; "это зависит". Если потоки заняты работой, интенсивно использующей процессор, нет смысла иметь больше, чем количество доступных ядер. Но если предположить, что они ожидают внешних результатов, они могут сильно различаться.
Я часто нахожу, что на этот вопрос отвечают архитектура и требования приложения; вам нужно столько нитей, сколько вам нужно.
Но если у вас потенциально есть неограниченное количество потоков, которые вы можете создать, я думаю, что это, вероятно, звучит как задача для ThreadPool; пусть он решает, сколько потоков на самом деле будет запущено.