Sobes.tech
Middle+

Android-də korutinləri necə sinxronizasiya etmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Android-də korutinləri sinxronlaşdırmaq üçün, konkret tapşırığa görə müxtəlif yanaşmalar istifadə oluna bilər:

  • Join: Digər korutinanın tamamlanmasını gözləmək.

    // Birinci korutinanı işə salırıq
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        println("İş 1 tamamlandı")
    }
    
    // İkinci korutinanı işə salırıq
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(500)
        println("İş 2 tamamlandı")
    }
    
    // Hər iki korutinanın tamamlanmasını gözləyirik
    job1.join()
    job2.join()
    
    println("Bütün işlər tamamlandı")
    
  • Await: Deferred ilə təmsil olunan asinxron əməliyyatın nəticəsini gözləmək.

    // Nəticə qaytaran asinxron əməliyyat
    val deferredResult = CoroutineScope(Dispatchers.Default).async {
        delay(1000)
        "Async-dən nəticə"
    }
    
    // Nəticəni gözləyirik
    val result = deferredResult.await()
    println(result)
    
  • CoroutineScope.coroutineScope: Yalnız bütün uşaq korutinalar tamamlandıqdan sonra bitəcək yeni bir sahə yaratmaq. Strukturlaşdırılmış rəqabət üçün faydalıdır.

    suspend fun doParallelWork() {
        coroutineScope { // Yeni strukturlaşdırılmış konkurrentlik sahəsi yaradılır
            launch { delay(1000); println("Tapşırıq 1 tamamlandı") }
            launch { delay(500); println("Tapşırıq 2 tamamlandı") }
        } // Bu nöqtəyə yalnız tapşırıq 1 və 2 tamamlandıqdan sonra çatılır
        println("Bütün paralel tapşırıqlar tamamlandı")
    }
    
  • Aktorların semantikasını (Channel): Mesaj mübadiləsi və korutinlər arasında dəyişən məlumatlara girişin sinxronizasiyası üçün.

    // Int üçün kanal yaradılır
    val channel = Channel<Int>()
    
    CoroutineScope(Dispatchers.Default).launch {
        // Kanal vasitəsilə məlumat göndərilir
        for (i in 1..5) {
            channel.send(i)
        }
        channel.close() // Göndərmədən sonra kanalı bağlayırıq
    }
    
    CoroutineScope(Dispatchers.Default).launch {
        // Kanaldan məlumat alırıq
        for (value in channel) {
            println("Qəbul edildi $value")
        }
    }
    
  • Mutex: Ümumi resursa eksklüziv giriş təmin etmək üçün.

    import kotlinx.coroutines.sync.Mutex
    import kotlinx.coroutines.sync.withLock
    
    val mutex = Mutex()
    var counter = 0
    
    suspend fun incrementCounter() {
        mutex.withLock { // Mutex-i əldə et
            counter++
            // Mutex avtomatik olaraq blokdan çıxanda azad edilir
        }
    }
    

Yöntəm seçimi dəqiq nə sinxronlaşdırılmalı olduğuna bağlıdır: tamamlanmanı gözləmək, nəticə almaq, paralel tapşırıqları idarə etmək, məlumat mübadiləsi və ya eksklüziv giriş təmin etmək. coroutineScope strukturlaşdırılmış rəqabət üçün standart yanaşmadır.