suspend помечает функцию, которую можно приостановить и продолжить позже; вызывать можно только из других suspend или через coroutine builder.
Разбор
- Компилятор превращает в state machine + Continuation.
- Не означает «фоновый поток» сам по себе.
withContext меняет диспетчер внутри suspend.
- Java видит как callback Continuation.
Пример
suspend fun loadUser(id: Long): User =
withContext(Dispatchers.IO) { api.getUser(id) }
Итог
suspend — контракт приостановки, а не автоматический background.