Middle
Que mecanismos o Kotlin fornece para trabalhar com cálculos paralelos?
sobes.tech IA
Resposta da IA
- Coroutines (Coroutines): Fios leves que permitem escrever código assíncrono de forma imperativa, evitando chamadas bloqueantes. Baseiam-se em funções reentrantes e não estão ligados a fios nativos.
- Dispatchers: Determinam o fio ou grupo de fios onde a coroutine será executada.
Dispatchers.Default: Para tarefas que consomem muitos recursos (por exemplo, CPU-bound).Dispatchers.IO: Para operações de entrada/saída (por exemplo, pedidos de rede, trabalho com ficheiros).Dispatchers.Main: Para executar código no fio principal (por exemplo, atualização de UI numa aplicação Android).Dispatchers.Unconfined: Executa a coroutine no fio atual até à primeira chamada a uma função suspensa.
- Funções suspend: Funções que podem ser pausadas e retomadas mais tarde. Marcam-se com o modificador
suspend. - Contexto: Contém informações sobre a coroutine, como o dispatcher, o job e o gestor de exceções.
- Job: Representa o ciclo de vida da coroutine (em execução, ativa, terminada, cancelada). Permite gerir a coroutine (cancelar, esperar que termine).
- Scope: Define o âmbito das coroutines, gerindo o seu ciclo de vida.
- MutableStateFlow / SharedFlow: Na biblioteca
kotlinx.coroutines.flow, permitem trocar dados de forma segura entre coroutines. - Mutex: Primitive de sincronização para proteger secções críticas.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Exemplo de uso de coroutines e dispatcher
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
println("Coroutine de trabalho: $i")
delay(100) // Atraso não bloqueante
}
}
println("Coroutine lançada")
job.join() // Espera que a coroutine termine
println("Coroutine terminada")
}
// Exemplo de função suspend
suspend fun fetchData(): String {
delay(1000) // Simulação de pedido de rede
return "Dados recebidos"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
counter++
}
}