Middle
Kotlin paralel hesablamalar ilə işləmək üçün hansı mexanizmləri təqdim edir?
sobes.tech Süni İntellekt
AI-dan cavab
- Koruletlər (Coroutines): Yüngül çəkili axınlar, asinxron kodu imperativ üslubda yazmağa imkan verir və bloklayan çağırışlardan qaçınır. Yenidən başlatıla bilən funksiyalara əsaslanır və yerli axınlara bağlı deyil.
- Dispatchers: Korutinanın icra olunacağı axın və ya axın hovuzunu müəyyən edir.
Dispatchers.Default: Resurs tələb edən tapşırıqlar üçün (məsələn, CPU-bound).Dispatchers.IO: Giriş/çıxış əməliyyatları üçün (məsələn, şəbəkə sorğuları, fayllarla işləmək).Dispatchers.Main: Kodun əsas axında icrası üçün (məsələn, Android tətbiqində UI yeniləməsi).Dispatchers.Unconfined: Korutinanı cari axında ilk suspend funksiyasına qədər icra edir.
- Suspend-funksiyalar: Dayandırıla və daha sonra davam etdirilə bilən funksiyalar.
suspendmodifieri ilə işarələnir. - Context: Korutina haqqında məlumatları ehtiva edir, məsələn, dispatcher, job və istisna işləyici.
- Job: Korutinanın həyat dövrünü təmsil edir (başlatdı, aktiv, tamamlandı, ləğv edildi). Korutinanı idarə etməyə imkan verir (ləğv et, tamamlanmasını gözlə).
- Scope: Korutinalar üçün sahəni müəyyən edir və onların həyat dövrünü idarə edir.
- MutableStateFlow / SharedFlow:
kotlinx.coroutines.flowkitabxanasında, korutinalar arasında təhlükəsiz məlumat mübadiləsini təmin edir. - Mutex: Kritik bölmələri qorumaq üçün sinxronizasiya primitive.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Korutinalar və dispatcher nümunəsi
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
println("İş korutinası: $i")
delay(100) // Bloklamayan gecikmə
}
}
println("Korutina başlatıldı")
job.join() // Korutinanın tamamlanmasını gözləyir
println("Korutina tamamlandı")
}
// Suspend-funksiyası nümunəsi
suspend fun fetchData(): String {
delay(1000) // Şəbəkə sorğusunun simulyasiyası
return "Məlumatlar alındı"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
counter++
}
}