Что такое приостановка потока
Что проверяют
Различает ли кандидат блокировку потока и приостановку корутины. В Android это не терминологическая придирка: главный поток один, пулы конечны, и путаница выливается в замерший интерфейс или исчерпанный диспетчер.
Заодно видно, на чём человек вырос. Ответ, построенный вокруг ручных потоков и устаревших обёрток над фоновыми задачами, показывает, что практика осталась в прошлом стеке.
Как отвечать
Разделите два механизма.
Блокировка: поток стоит и остаётся занятым. Это Thread.sleep, ожидание монитора, синхронный сетевой вызов. В терминах состояний потока это BLOCKED, WAITING, TIMED_WAITING: работы нет, а ресурс удерживается.
Приостановка корутины: suspend-функция сохраняет продолжение и отпускает поток, который тут же берёт другую задачу. Поэтому delay не эквивалентен Thread.sleep, хотя внешне делают одно и то же.
viewModelScope.launch {
val user = withContext(Dispatchers.IO) { repo.load() } // блокирующее уводим с главного потока
render(user)
}Добавьте про отмену: она кооперативная. Корутина прекращается в точке приостановки либо там, где код сам проверил активность области, поэтому тяжёлый цикл без таких точек не остановится.
Где спотыкаются
Говорят, что suspend приостанавливает поток. Наоборот, освобождает: тысяча корутин с delay спокойно живёт на одном диспетчере, тысяча вызовов Thread.sleep упрётся в число потоков.
Кладут блокирующий вызов внутрь suspend-функции и не меняют диспетчер. Сигнатура обещает вызывающему коду, что функция не блокирует, а интерфейс замирает. Смена диспетчера это ответственность самой функции, а не того, кто её зовёт.
Предлагают ручные остановку и возобновление потока. Эти методы давно объявлены опасными: поток замирает, не отпуская захваченные мониторы, и получается взаимная блокировка. Остановка собственным флагом тоже требует видимости между потоками, иначе изменение просто не дойдёт.