Ответ
Большое количество потоков может снизить эффективность из-за накладных расходов на переключение контекста, синхронизацию и конкуренцию за ресурсы (CPU, память).
- Переключение контекста – при большом числе потоков процессор тратит время на сохранение/восстановление состояний.
- Синхронизация – блокировки (
synchronized,ReentrantLock) приводят к ожиданию и простоям. - Кэш-промахи – частые переключения потоков снижают эффективность кэша CPU.
Пример:
// Плохо: 1000 потоков для легковесных задач
repeat(1000) {
thread { println("Task $it") }
}
// Лучше: использовать пул потоков (например, Dispatchers.IO)
repeat(1000) {
CoroutineScope(Dispatchers.IO).launch { println("Task $it") }
}
Оптимальное число потоков ≈ количеству ядер CPU (для CPU-bound задач). Для IO-bound задач можно использовать асинхронные API (корутины, RxJava).