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.