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
suspendsó podem ser chamadas de coroutines ou de outras funçõessuspend. suspendnã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
suspenddiretamente.
suspend é a base de tudo que envolve concorrência em Kotlin. Dominar esse conceito abre as portas para coroutines, Flow e muito mais.