Что такое дефолтный поток в Kotlin Coroutines?
Что проверяют
Понимаете ли вы, что корутина не привязана к потоку, а исполняется на диспетчере, и знаете ли, какой диспетчер включается, когда вы его не указали. В Android это прикладной вопрос: ошибка здесь даёт либо подвисший интерфейс, либо сеть на пуле для вычислений.
Как отвечать
Разделите два смысла вопроса. Dispatchers.Default это пул под нагрузку на процессор, его размер равен числу ядер, но не меньше двух: парсинг, сортировка, сжатие, обработка картинки в памяти. Он же подставляется, когда диспетчера в контексте нет вообще, например у корутины из GlobalScope.
Но «по умолчанию» для конкретного launch значит другое: дочерняя корутина наследует контекст родителя. В viewModelScope и lifecycleScope это Dispatchers.Main.immediate, поэтому корутина без аргументов пойдёт по главному потоку, а не по Default.
viewModelScope.launch { // Main.immediate
val raw = repo.load() // suspend, блокирующее внутри на IO
val ready = withContext(Dispatchers.Default) { heavyParse(raw) }
state.value = ready
}Добавьте, что Default и IO делят один пул потоков, поэтому переключение между ними дешёвое, а IO просто разрешает занять больше потоков (по умолчанию до шестидесяти четырёх) под блокирующие вызовы. Своё ограничение параллелизма задаётся через limitedParallelism.
Где спотыкаются
Отправляют в Default сеть и работу с файлами. Пул размером с число ядер забивается блокирующими вызовами целиком, после чего встают и настоящие вычисления. Блокирующее идёт в IO, а аккуратно написанная suspend-функция переключает диспетчер внутри себя, и вызывающему думать об этом не приходится.
Отвечают примером на GlobalScope. Такая корутина не привязана к жизненному циклу, не отменяется вместе с экраном и удерживает ссылки на него. В Android это готовая утечка, и на собеседовании такой пример читается как незнание структурированной конкурентности.
Путают диспетчер с потоком. Одна корутина может начаться на одном потоке пула, а после точки приостановки продолжиться на другом, поэтому ThreadLocal и проверки идентичности потока здесь не работают. По той же причине в тестах подменяют диспетчер, а не ловят конкретный поток.