Comments 7
Это всё-таки не универсальный ответ.
На CPU-bound задачах лучше утилизировать все ядра, причём, желательно минимизировать количество переключений контекста. Для этого обычно лучше всего подходит количество ядер = количество потоков.
А для IO-bound задач надо смотреть, что это за IO, какой планировщик используется в системе, и прочее… Вот тут только бенчмарк, заранее что-то сказать нельзя.
UPD: увидел, что это описано в последнем абзаце, согласен.
Ну, на самом-то деле все обычно еще интереснее. Это у вас один пул на приложение, а если их будет несколько (а их будет — потому что некоторые фреймворки их будут создавать, не спрашивая у вас)? Ну плюс все остальное, что уже изложили...
Я боюсь что это в общем случае невозможно. Во-первых, насколько я помню, common pool появился в 8-ке, а просто ForkJoin — раньше. Так что вполне может существовать кучка фреймворков, написанных иначе.
А во-вторых, все равно бывают требования, которые противоречат общему пулу. Причем тривиальные — наличие одновременно пакетных и интерактивных задач, например. Или даже просто интерактивных — для них обычно наплевать, что процессор недогружен до 100%, главное чтобы время реакции было хорошим.
Каков должен быть размер у Thread Pool?