Ce este o coroutine în Kotlin și cum funcționează?
sobes.tech AI
Răspuns de la AI
Coroutine în Kotlin este o unitate ușor de execuție care permite scrierea de cod asincron și non-blocant într-un mod mai lizibil și secvențial. Este similar cu un thread, dar mult mai ușor și poate fi creat în cantități mari.
Componentele principale și principiile de funcționare:
- Funcții Suspendate: Funcții marcate cu cuvântul cheie
suspend, care pot suspenda execuția lor fără a bloca thread-ul pe care rulează. Când o funcție suspendată își încheie operațiunea de "așteptare" (de exemplu, o solicitare de rețea), poate relua execuția de unde a fost suspendată. - Contextul (Contextul Coroutine): Un set de elemente care controlează comportamentul coroutinei. Include:
Job: Descriptorul coroutinei, care permite gestionarea ciclului său de viață (anulare, așteptare pentru finalizare).CoroutineDispatcher: Definește thread-urile pe care va fi executată corutina. Permite comutarea între thread-uri.CoroutineName: Nume opțional pentru depanare.CoroutineExceptionHandler: Handler pentru excepții necontrolate.
- Constructorii (Builders): Funcții care pornesc execuția corutinelor:
launch: Pornește o nouă corutină fără a returna rezultat. Returnează unJob.async: Pornește o nouă corutină care returnează un rezultat (Deferred). Pentru a obține rezultatul, se folosește.await().runBlocking: Constructor blocant, utilizat în principal pentru testare sau integrare cu cod blocant.
Cum funcționează în spate:
Corutinele nu creează thread-uri separate pentru fiecare sarcină. În schimb, atunci când o funcție suspend este suspendată, compilatorul generează cod care salvează starea curentă a calculelor. Când rezultatul este disponibil, corutina este reluată pe unul dintre thread-urile gestionate de CoroutineDispatcher. Acest lucru se realizează transformând funcțiile suspend în apeluri asincrone cu continuări, permițând unui thread să execute multiple corutine, schimbând între ele la suspendare.
Exemplu:
import kotlinx.coroutines.*
fun main() = runBlocking { // Blochează thread-ul curent până când corutina din runBlocking se finalizează
println("Mai întâi")
launch { // Pornește o nouă corutină în fundal
delay(1000L) // Întârziere non-blocantă de 1 secundă
println("După întârziere")
}
println("Apoi") // Această linie va fi executată înainte ca launch să se termine
}
Ieșirea acestui cod va fi:
Mai întâi
Apoi
După întârziere
Aceasta demonstrează natura non-blocantă a launch și delay.