În dezvoltarea aplicațiilor mobile și a serviciilor de backend, blocarea firelor de execuție pentru operațiuni I/O (descărcare de date din rețea, citire de fișiere, interogări de baze de date) duce la blocarea interfeței grafice (ANR – Application Not Responding) sau la epuizarea rapidă a memoriei serverului.
Kotlin Coroutines oferă un model de asincronism de ultra-înaltă performanță: fire de execuție ușoare (Lightweight Threads) gestionate în User Space. O singură aplicație poate rula sute de mii de corutine simultan fără probleme de memorie!
import kotlinx.coroutines.*
// Funcție asincronă de nivel înalt:
suspend fun incarcaDatePanouControl(): PanouControl = coroutineScope {
// coroutineScope garantează concurența structurată: dacă oricare dintre apelurile async
// eșuează cu o excepție, celelalte sarcini active sunt anulate automat în cascadă!
// Lansăm două descărcări paralele:
val dateUtilizator: Deferred = async(Dispatchers.IO) {
descarcaProfilUtilizator()
}
val dateStatistici: Deferred> = async(Dispatchers.IO) {
descarcaStatisticiVanzari()
}
// Așteptăm ambele rezultate în mod non-blocant cu .await():
PanouControl(
utilizator = dateUtilizator.await(),
statistici = dateStatistici.await()
)
}
// Funcție de suspendare:
suspend fun descarcaProfilUtilizator(): String {
delay(500) // delay() suspendă corutina fără a bloca firul fizic!
return "Dexter"
}
suspend fun descarcaStatisticiVanzari(): List {
delay(400)
return listOf(100, 250, 400)
}
data class PanouControl(val utilizator: String, val statistici: List)
Cum Funcționează Sub Capotă (Continuation-Passing Style – CPS)?
La momentul compilării, compilatorul Kotlin transformă fiecare funcție suspend într-o mașină de stări, adăugând un parametru ascuns: Continuation<T>. Când corutina ajunge la un punct de suspendare (ex: delay sau apel de rețea), ea salvează starea curentă a variabilelor locale și cedează firul fizic; când operațiunea I/O se finalizează, runtime-ul apelează continuation.resumeWith(...) pentru a relua execuția exact de unde a rămas!