Sobes.tech
Middle+

Kuidas sünkroniseerida korutinas Androidis?

sobes.tech AI

Vastus AI-lt

Androidis korutinite sünkroneerimiseks saab kasutada mitmeid lähenemisviise, sõltuvalt konkreetsest ülesandest:

  • Join: oodata teise korutina lõpetamist:

    // Esimese korutina käivitamine
    val job1 = CoroutineScope(Dispatchers.Default).launch {
        delay(1000)
        println("Töö 1 tehtud")
    }
    
    // Teise korutina käivitamine
    val job2 = CoroutineScope(Dispatchers.Default).launch {
        delay(500)
        println("Töö 2 tehtud")
    }
    
    // Oodata mõlema korutina lõpetamist
    job1.join()
    job2.join()
    
    println("Kõik tööd tehtud")
    
  • Await: oodata asünkroonse operatsiooni tulemust, mis on esindatud Deferred-iga:

    // Asünkroonne operatsioon, mis tagastab tulemuse
    val deferredResult = CoroutineScope(Dispatchers.Default).async {
        delay(1000)
        "Async tulemus"
    }
    
    // Oodata tulemust
    val result = deferredResult.await()
    println(result)
    
  • CoroutineScope.coroutineScope: luua uus nähtavusala, mis lõpeb alles pärast kõigi alamkorutinate lõpetamist. Kasulik struktuurse konkurentsi jaoks:

    suspend fun doParallelWork() {
        coroutineScope { // luua uus struktureeritud konkurentsiala
            launch { delay(1000); println("Ülesanne 1 tehtud") }
            launch { delay(500); println("Ülesanne 2 tehtud") }
        } // See punkt saavutatakse alles pärast ülesannete 1 ja 2 lõpetamist
        println("Kõik paralleelsed ülesanded lõpetatud")
    }
    
  • Aktorite semantika (Channel): sõnumite vahetamine ja juurdepääsu sünkroneerimine muudetavate andmete vahel korutinate vahel:

    // Kanal loomine Int vahetamiseks
    val channel = Channel<Int>()
    
    CoroutineScope(Dispatchers.Default).launch {
        // andmete saatmine kanalile
        for (i in 1..5) {
            channel.send(i)
        }
        channel.close() // kanali sulgemine saatmise järel
    }
    
    CoroutineScope(Dispatchers.Default).launch {
        // andmete vastuvõtt kanalilt
        for (value in channel) {
            println("Vastuvõetud $value")
        }
    }
    
  • Mutex: tagada eksklusiivne juurdepääs ühisele ressursile:

    import kotlinx.coroutines.sync.Mutex
    import kotlinx.coroutines.sync.withLock
    
    val mutex = Mutex()
    var counter = 0
    
    suspend fun incrementCounter() {
        mutex.withLock { // mutex hankimine
            counter++
        }
    }
    

Valik sõltub sellest, mida täpselt vaja sünkroneerida: lõpetamise ootamine, tulemuse saamine, paralleelsete ülesannete juhtimine, andmete vahetamine või eksklusiivne juurdepääs. coroutineScope on soovitatav lähenemisviis struktuurse konkurentsi jaoks vaikimisi.