Sobes.tech
Middle

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): suspend aç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. Job qaytarı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, launchdelay-in bloklamayan xarakterini göstərir.