Ответ
Количество потоков в DefaultDispatcher фиксировано и зависит от ядер процессора, потому что это оптимальное значение для CPU-bound задач. Kotlin Coroutines использует формулу max(2, количество_ядер) для баланса между параллелизмом и накладными расходами на переключение контекста.
Пример:
val cores = Runtime.getRuntime().availableProcessors()
println("DefaultDispatcher threads: ${cores.coerceAtLeast(2)}")
Это компромисс:
- Меньше потоков → меньше contention (конкуренции за ресурсы)
- Достаточно для параллельной обработки
- Избегает oversubscription (когда потоков больше, чем ядер)
Для IO-bound задач лучше использовать Dispatchers.IO, который расширяет пул при необходимости.