Suspend — это просто маркер на уровне компилятора Kotlin. Он как бы говорит: «Эта функция может приостанавливаться, но при этом оставаться в том же потоке».
На уровне JVM-кода suspend-функция превращается в обычный метод с дополнительным параметром Continuation<T> и возвращает Any?.
Что такое Continuation?
Continuation<T> — это объект-колбэк, который как бы говорит: «Когда операция закончится — продолжи выполнение с этого места и верни результат типа T (или исключение)».
Он содержит:
- ссылку на текущую точку выполнения (label — номер состояния)
- ссылку на корутину
- стековые переменные (локальные переменные сохраняются в полях объекта)
Как работает suspend-функция?
Каждая suspend-функция превращается в state machine. Компилятор создаёт переменную label (int), которая хранит, на каком шаге мы остановились.
Пример delay(1000) внутри:
suspend fun example() {
println("A")
delay(1000)
println("B")
}
После компиляции — примерно так (упрощённо):
Object example(Continuation c) {
when (c.label) {
0 -> {
c.label = 1
if (Delay.delay(1000, c) == COROUTINE_SUSPENDED)
return COROUTINE_SUSPENDED
// продолжаем
}
1 -> {
println("B")
return Unit
}
}
}
- При первом вызове: label = 0
- При вызове delay() передаём c как continuation
- delay() ставит задачу в очередь и возвращает специальный объект COROUTINE_SUSPENDED
- Если вернулся COROUTINE_SUSPENDED → корутина приостанавливается
- Через 1000 мс delay возобновляет корутину с label = 1
- Выполняется println(«B»)