Kotlin-də korutina nədir və necə işləyir?
sobes.tech Süni İntellekt
AI-dan cavab
Kotlin-də korutina yüngül icra vahididir və asinxron və bloklamayan kodu daha oxunaqlı və ardıcıl şəkildə yazmağa imkan verir. Bu, thread-ə bənzəyir, lakin çox yüngüldür və çox sayda yaradıla bilər.
Əsas komponentlər və iş prinsipləri:
- Dayandırıla bilən funksiyalar (Suspend Functions):
suspendaçar sözü ilə işarələnmiş funksiyalar, icra zamanı thread-i bloklamadan dayandıra bilər. Dayandırılmış funksiya, "gözləmə" əməliyyatını (məsələn, şəbəkə sorğusu) tamamladıqda, dayandırıldığı yerdən davam edə bilər. - Kontext (Korutina konteksti): Korutinanın davranışını idarə edən elementlər toplusu. Bunlara daxildir:
Job: Korutinanın həyat dövrünü idarə edən təsvirçi.CoroutineDispatcher: Korutinanın icra olunacağı thread və ya threadlər. Thread-lər arasında keçid etməyə imkan verir.CoroutineName: Debug üçün opsional ad.CoroutineExceptionHandler: İdarə olunmamış istisnalar üçün handler.
- Yaradıcısı (Builders): Korutinaları işə salan funksiyalar:
launch: Yeni korutina başlatır, nəticə qaytarmır.Jobqaytarır.async: Nəticə qaytaran (Deferred) yeni korutina başlatır. Nəticəni almaq üçün.await()istifadə olunur.runBlocking: Bloklayıcı yaradıcısı, əsasən test və ya bloklayan kod ilə inteqrasiya üçün istifadə olunur.
İş prinsipi:
Korutinalar hər bir tapşırıq üçün ayrı thread yaratmır. Əvəzində, suspend funksiyası dayandırıldıqda, tərtibçi hazırkı hesablamaların vəziyyətini saxlayan kodlar yaradır. Nəticə mövcud olduqda, korutina CoroutineDispatcher tərəfindən idarə olunan thread-lərdən birində davam etdirilir. Bu, suspend funksiyalarını asinxron çağırışlara çevirməklə, bir thread-in çox sayda korutina icra etməsinə və dayandırıldıqda arasında keçid etməsinə imkan verir.
Nümunə:
import kotlinx.coroutines.*
fun main() = runBlocking { // Mövcud thread-i bloklayır, runBlocking içindəki korutina tamamlanana qədər
println("Əvvəl")
launch { // Arxa planda yeni korutina başlat
delay(1000L) // Bloklamayan 1 saniyəlik gecikmə
println("Gecikmədən sonra")
}
println("Sonra") // Bu sətir launch korutinası bitməmişdən əvvəl icra olunacaq
}
Nəticə:
Əvvəl
Sonra
Gecikmədən sonra
Bu, launch və delay-in bloklamayan xarakterini göstərir.