O que é Channel em Kotlin?
Um Channel em Kotlin é uma estrutura para comunicação entre coroutines. Funciona como uma fila: uma coroutine envia dados pelo canal e outra recebe do outro lado. É o jeito mais seguro de trocar informações entre coroutines sem problemas de concorrência.
Se o Flow é como uma torneira (um produtor, um consumidor), o Channel é mais como um cano de comunicação bidirecional entre partes independentes do código.
Exemplo básico
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun main() = runBlocking {
val canal = Channel<String>()
launch {
canal.send("Primeira mensagem")
canal.send("Segunda mensagem")
canal.close()
}
for (msg in canal) {
println("Recebido: $msg")
}
}
O send envia dados para o canal e o for consome. Quando o canal é fechado com close(), o loop encerra automaticamente.
Tipos de Channel
Kotlin oferece diferentes capacidades de buffer:
// Sem buffer — send suspende até alguém fazer receive
val rendezvous = Channel<Int>()
// Buffer limitado
val buffered = Channel<Int>(capacity = 10)
// Buffer ilimitado
val unlimited = Channel<Int>(Channel.UNLIMITED)
// Mantém só o último valor
val conflated = Channel<Int>(Channel.CONFLATED)
Produtor e consumidor
O padrão produtor-consumidor fica bem elegante com produce:
import kotlinx.coroutines.*
import kotlinx.coroutines.channels.*
fun CoroutineScope.produzirNumeros() = produce {
for (i in 1..5) {
delay(300)
send(i)
}
}
fun main() = runBlocking {
val numeros = produzirNumeros()
for (n in numeros) {
println("Número: $n")
}
}
Channel vs Flow
A principal diferença é que Channel é hot — ele produz dados independente de ter alguém consumindo. Já o Flow é cold — só produz quando alguém coleta.
| Característica | Channel | Flow |
|---|---|---|
| Tipo | Hot | Cold |
| Produtores | Um ou vários | Um |
| Consumidores | Um | Um ou vários |
Use Channel quando precisar de comunicação ativa entre coroutines. Para streams de dados reativos, prefira Flow.