Sobes.tech
Middle+

Чӣ гуна корутинҳоро дар Android ҳамоҳанг кардан мумкин аст?

sobes.tech AI

Ҷавоб аз AI

Барои ҳамоҳангсозии корутинҳо дар Android метавонед чанд роҳро истифода баред, вобаста ба вазифаи мушаххас:

  • Join: интизор шудан барои анҷоми кори дигар корутина.

    // Иҷрои аввалин корутина
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        println("Корутина 1 анҷом ёфт")
    }
    
    // Иҷрои дуввум корутина
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(500)
        println("Корутина 2 анҷом ёфт")
    }
    
    // интизор шудан барои анҷоми ҳар ду корутина
    job1.join()
    job2.join()
    
    println("Ҳамаи корҳо анҷом ёфт")
    
  • Await: интизор шудан барои натиҷаи амалиёти асинхронии, ки Deferred-ро намояндагӣ мекунад.

    // Амалиёти асинхронии, ки натиҷа медиҳад
    val deferredResult = CoroutineScope(Dispatchers.Default).async {
        delay(1000)
        "Натиҷаи аз async"
    }
    
    // интизор шудан барои натиҷа
    val result = deferredResult.await()
    println(result)
    
  • CoroutineScope.coroutineScope: Таҳия кардани минтақаи нави назорат, ки танҳо пас аз анҷоми ҳамаи корутинаҳои зерини он ба охир мерасад. Барои рақобати сохторӣ муфид аст.

    suspend fun doParallelWork() {
        coroutineScope { // Таҳия кардани соҳаи нави рақобат
            launch { delay(1000); println("Корутина 1 анҷом ёфт") }
            launch { delay(500); println("Корутина 2 анҷом ёфт") }
        } // Ин нуқта танҳо пас аз анҷоми корутинаҳои 1 ва 2 ба даст меояд
        println("Ҳамаи корҳои параллелӣ анҷом ёфт")
    }
    
  • Семантикаи каналҳо (Channel): Барои мубодилаи паёмҳо ва ҳамоҳангсозии дастрасӣ ба маълумоти тағйирёбанда байни корутинҳо.

    // Таҳия кардани канал барои мубодилаи Int
    val channel = Channel<Int>()
    
    CoroutineScope(Dispatchers.Default).launch {
        // Иҷрои маълумот ба канал
        for (i in 1..5) {
            channel.send(i)
        }
        channel.close() // Баста кардани канал пас аз ирсол
    }
    
    CoroutineScope(Dispatchers.Default).launch {
        // гирифтани маълумот аз канал
        for (value in channel) {
            println("Пас аз гирифтани $value")
        }
    }
    
  • Mutex: Барои таъмин кардани дастрасии эксклюзивӣ ба манбаи умумӣ.

    import kotlinx.coroutines.sync.Mutex
    import kotlinx.coroutines.sync.withLock
    
    val mutex = Mutex()
    var counter = 0
    
    suspend fun incrementCounter() {
        mutex.withLock { // гирифтани mutex
            counter++
        }
    }
    

Интихоби усул вобаста аст, ки чӣ бояд ҳамоҳангсозӣ шавад: интизор шудан барои анҷом, гирифтани натиҷа, идоракунии вазифаҳои параллелӣ, мубодилаи маълумот ё дастрасии эксклюзивӣ. coroutineScope ҳамчун роҳи тавсияшуда барои рақобати сохторӣ истифода мешавад.