Middle
Quels mécanismes Kotlin offre-t-il pour le traitement parallèle?
sobes.tech IA
Réponse de l'IA
- Coroutines (Coroutines): Des threads légers qui permettent d'écrire du code asynchrone de manière impérative, en évitant les appels bloquants. Basés sur des fonctions ré-entrant et non liés aux threads natifs.
- Dispatchers: Définissent le thread ou le pool de threads où la coroutine sera exécutée.
Dispatchers.Default: Pour les tâches gourmandes en ressources (par exemple, CPU-bound).Dispatchers.IO: Pour les opérations d'entrée/sortie (par exemple, requêtes réseau, travail avec des fichiers).Dispatchers.Main: Pour exécuter du code sur le thread principal (par exemple, mise à jour de l'UI dans une application Android).Dispatchers.Unconfined: Exécute la coroutine sur le thread actuel jusqu'au premier appel à une fonction suspendue.
- Fonctions suspend: Fonctions pouvant être suspendues et reprises plus tard. Marquées avec le modificateur
suspend. - Contexte: Contient des informations sur la coroutine, comme le dispatcher, le job et le gestionnaire d'exceptions.
- Job: Représente le cycle de vie de la coroutine (en cours, active, terminée, annulée). Permet de gérer la coroutine (annuler, attendre sa fin).
- Scope: Définit le périmètre des coroutines, gérant leur cycle de vie.
- MutableStateFlow / SharedFlow: Dans la bibliothèque
kotlinx.coroutines.flow, permettent d'échanger des données en toute sécurité entre coroutines. - Mutex: Primitive de synchronisation pour protéger les sections critiques.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Exemple d'utilisation de coroutines et dispatcher
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
println("Coroutine de travail : $i")
delay(100) // Retard non bloquant
}
}
println("Coroutine lancée")
job.join() // Attend la fin de la coroutine
println("Coroutine terminée")
}
// Exemple de fonction suspend
suspend fun fetchData(): String {
delay(1000) // Simulation d'une requête réseau
return "Données reçues"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
counter++
}
}