Middle
Ce mecanisme oferă Kotlin pentru a lucra cu calcule paralele?
sobes.tech AI
Răspuns de la AI
- Corutine (Coroutines): Fire ușor de greutate, care permit scrierea codului asincron în stil imperativ, evitând apelurile blocante. Bazate pe funcții reîncepătoare și nu sunt legate de fire native.
- Dispatchers: Determină firul sau grupul de fire în care va fi executată corutina.
Dispatchers.Default: Pentru sarcini intensive în resurse (de exemplu, CPU-bound).Dispatchers.IO: Pentru operațiuni de intrare/ieșire (de exemplu, solicitări de rețea, lucru cu fișiere).Dispatchers.Main: Pentru executarea codului pe firul principal (de exemplu, actualizarea UI în aplicația Android).Dispatchers.Unconfined: Execută corutina pe firul curent până la primul apel al unei funcții suspendate.
- Funcții suspend: Funcții care pot fi puse în pauză și reluate mai târziu. Marcate cu modificatorul
suspend. - Context: Conține informații despre corutină, cum ar fi dispatcher, job și handler de excepții.
- Job: Reprezintă ciclul de viață al corutinei (pornită, activă, finalizată, anulată). Permite gestionarea corutinei (anulare, așteptare finalizare).
- Scope: Definește domeniul de aplicare pentru corutine, gestionând ciclul lor de viață.
- MutableStateFlow / SharedFlow: În biblioteca
kotlinx.coroutines.flow, permit schimbul sigur de date între corutine. - Mutex: Primitive de sincronizare pentru protejarea secțiunilor critice.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Exemplu de utilizare a corutinei și dispatcher
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
println("Corutină de lucru: $i")
delay(100) // Întârziere non-blocantă
}
}
println("Corutină lansată")
job.join() // Așteaptă finalizarea corutinei
println("Corutină finalizată")
}
// Exemplu de funcție suspend
suspend fun fetchData(): String {
delay(1000) // Simulare solicitare de rețea
return "Date primite"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
counter++
}
}