Ответ
Потоки зависят от количества ядер, потому что ядра процессора физически выполняют инструкции. Каждое ядро может обрабатывать один поток одновременно.
Если ядер больше — система может параллельно выполнять больше потоков без переключения контекста. Например, на 4-ядерном процессоре 4 потока будут работать действительно параллельно, а на 2-ядерном — только 2, остальные будут выполняться с переключением.
// Пример: оптимальное кол-во потоков для CPU-bound задач
val cores = Runtime.getRuntime().availableProcessors()
val executor = Executors.newFixedThreadPool(cores)
Но это не значит, что потоков не может быть больше ядер — система использует вытесняющую многозадачность, переключая потоки на ядрах. Однако слишком много потоков приведет к накладным расходам на переключение.