Middle
Kotlin parallel hisoblashlar bilan ishlash uchun qanday mexanizmlar taqdim etadi?
sobes.tech AI
AIdan javob
- Coroutines (Coroutines): Yengil vaznli oqimlar bo'lib, ular asinxron kodni imperativ uslubda yozishga imkon beradi va bloklovchi chaqiruvlardan qochadi. Qayta boshlanadigan funksiyalarga asoslangan va nativ oqimlarga bog'liq emas.
- Dispatchers: Korutina bajariladigan oqim yoki oqimlar havuzini belgilaydi.
Dispatchers.Default: Resurslarni ko'p sarflaydigan vazifalar uchun (masalan, CPU-ga bog'liq).Dispatchers.IO: Kiritish/chiqish operatsiyalari uchun (masalan, tarmoq so'rovlar, fayllar bilan ishlash).Dispatchers.Main: Kodni asosiy oqimda bajarish uchun (masalan, Android ilovasida UI yangilash).Dispatchers.Unconfined: Korutina hozirgi oqimda bajariladi, suspend-funksiyaga birinchi chaqiruvingacha.
- Suspend-funksiyalar: To'xtatilishi va keyinchalik davom ettirilishi mumkin bo'lgan funksiyalar.
suspendmodifikatori bilan belgilangan. - Context: Korutina haqida ma'lumotlarni o'z ichiga oladi, masalan, dispatcher, job va istisno ishlovchi.
- Job: Korutinaning hayot aylanishini ifodalaydi (ishga tushirilgan, faol, tugagan, bekor qilingan). Korutina boshqarish imkonini beradi (bekor qilish, tugashini kutish).
- Scope: Korutinalar uchun doira belgilaydi va ularning hayot aylanishini boshqaradi.
- MutableStateFlow / SharedFlow:
kotlinx.coroutines.flowkutubxonasida, korutinalar o'rtasida xavfsiz ma'lumot almashishni ta'minlaydi. - Mutex: Kritik bo'limlarni himoya qilish uchun sinxronizatsiya primitive.
import kotlinx.coroutines.*
fun main() = runBlocking {
// Korutinalar va dispatcher misoli
val job = launch(Dispatchers.Default) {
repeat(5) { i ->
println("Ishchi korutina: $i")
delay(100) // Bloklamaydigan kechikish
}
}
println("Korutina ishga tushirildi")
job.join() // Korutina tugashini kutish
println("Korutina tugatildi")
}
// Suspend-funksiya misoli
suspend fun fetchData(): String {
delay(1000) // Tarmoq so'rovini simulyatsiya qilish
return "Ma'lumotlar olindi"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
val mutex = Mutex()
var counter = 0
suspend fun incrementCounter() {
mutex.withLock {
counter++
}
}