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 — структураланган атаандаштык үчүн сунушталган негизги ыкма.