Как работают suspend функции?

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»)

Опубликовано

в

,

от

Метки: