Что тяжелее по ресурсам — поток или корутина
Что проверяют
Понимаете ли вы, что корутина не заменяет поток, а избавляет от необходимости занимать его на время ожидания. Это базовый вопрос, за которым сразу идут диспетчеры, отмена и работа с блокирующими библиотеками, поэтому путаница в основании видна мгновенно.
Как отвечать
Поток это сущность операционной системы: планировщик ядра, собственный стек, память под который резервируется заранее и измеряется сотнями килобайт, переключение контекста через ядро. Создание дорогое, поэтому потоки держат в пулах, а не создают на задачу.
Корутина это объект в куче: состояние, континуация и точка возобновления. Компилятор превращает suspend-функцию в конечный автомат, и на время ожидания поток освобождается для другой работы. Корутин можно держать сотни тысяч, цена создания сравнима с обычным объектом.
Вывод по существу вопроса: корутина легче на порядки и по памяти, и по цене запуска, но исполняется она всё равно на потоке диспетчера. Выигрыш исчезает, если внутри блокирующий вызов: Thread.sleep, блокирующий драйвер базы или файловый ввод-вывод занимают поток целиком, и мы возвращаемся к цене потоков.
В Android это разложено по диспетчерам: Dispatchers.Default под вычисления с пулом по числу ядер, Dispatchers.IO под блокирующие вызовы, Dispatchers.Main это единственный поток интерфейса. Плюс структурная конкурентность: отмена скоупа снимает всех детей, у голых потоков такого нет.
Где спотыкаются
Говорят, что корутины живут в одном потоке. В один поток укладываются только Main и явно созданный однопоточный контекст, всё остальное это пул, и общая изменяемая переменная требует защиты ровно как в многопоточном коде.
Считают слово suspend синонимом фона. Сам по себе вызов suspend-функции поток не меняет: тяжёлый расчёт без withContext останется на потоке интерфейса и подвесит отрисовку.
Обещают дешевизну и тут же вешают блокирующий код. Миллион корутин упрётся в потолок пула, а отмена не прервёт блокирующую операцию: отмена кооперативная, и без проверок активности или прерываемого API работа продолжится в пустоту.