O que é suspend em Kotlin?

A palavra-chave suspend marca uma função que pode ser pausada e retomada sem bloquear a thread em que está rodando. É o coração do sistema de coroutines do Kotlin.

Uma função suspend só pode ser chamada dentro de outra função suspend ou dentro de uma coroutine. O compilador garante isso em tempo de compilação, então não tem como errar.

Sintaxe básica

import kotlinx.coroutines.*

suspend fun buscarUsuario(id: Int): String {
    delay(1000) // Simula uma operação demorada
    return "Usuário #$id"
}

fun main() = runBlocking {
    val usuario = buscarUsuario(42)
    println(usuario) // Usuário #42
}

A função buscarUsuario é suspensa — ela pode pausar no delay e liberar a thread para fazer outras coisas. Quando o tempo passa, ela retoma de onde parou.

O que acontece por baixo dos panos?

Quando o compilador encontra uma função suspend, ele transforma ela numa máquina de estados usando continuations. Na prática, a função é dividida em pedaços que podem ser executados em momentos diferentes.

Você não precisa se preocupar com esses detalhes pra usar, mas é bom saber que não tem mágica — é tudo gerado em tempo de compilação.

Combinando funções suspend

import kotlinx.coroutines.*

suspend fun buscarNome(): String {
    delay(500)
    return "Fernanda"
}

suspend fun buscarCidade(): String {
    delay(500)
    return "Recife"
}

fun main() = runBlocking {
    val inicio = System.currentTimeMillis()

    val nome = buscarNome()
    val cidade = buscarCidade()

    val tempo = System.currentTimeMillis() - inicio
    println("$nome mora em $cidade (${tempo}ms)")
    // Fernanda mora em Recife (~1000ms - sequencial)
}

No exemplo acima, as chamadas são sequenciais. Se quiser executar em paralelo, use async — aí o tempo cai pela metade.

Regras importantes

  • Funções suspend só podem ser chamadas de coroutines ou de outras funções suspend.
  • suspend não torna a função assíncrona por si só — ela apenas permite a suspensão.
  • Funções normais não podem chamar funções suspend diretamente.

suspend é a base de tudo que envolve concorrência em Kotlin. Dominar esse conceito abre as portas para coroutines, Flow e muito mais.