Sobes.tech
Middle

Welke mechanismen biedt Kotlin voor het werken met parallelle berekeningen?

sobes.tech AI

Antwoord van AI

  • Coroutines (Coroutines): Lichtgewichtige threads die het mogelijk maken om asynchrone code in imperatieve stijl te schrijven, en blokkades te vermijden. Gebaseerd op hervatbare functies en niet gekoppeld aan native threads.
  • Dispatchers: Bepalen de thread of threadpool waarop de coroutine wordt uitgevoerd.
    • Dispatchers.Default: Voor resource-intensieve taken (bijvoorbeeld CPU-bound).
    • Dispatchers.IO: Voor I/O-operaties (bijvoorbeeld netwerkverzoeken, werken met bestanden).
    • Dispatchers.Main: Voor het uitvoeren van code op de hoofdthread (bijvoorbeeld UI-updates in een Android-app).
    • Dispatchers.Unconfined: Voert de coroutine uit op de huidige thread tot de eerste aanroep van een suspend-functie.
  • Suspend-functies: Functies die gepauzeerd en later hervat kunnen worden. Gemarkeerd met de modifier suspend.
  • Context: Bevat informatie over de coroutine, zoals de dispatcher, job en exception handler.
  • Job: Vertegenwoordigt de levenscyclus van de coroutine (gestart, actief, voltooid, geannuleerd). Maakt het beheer van de coroutine mogelijk (annuleren, wachten op voltooiing).
  • Scope: Bepaalt het bereik van de coroutines en beheert hun levenscyclus.
  • MutableStateFlow / SharedFlow: In de bibliotheek kotlinx.coroutines.flow, maken ze veilige gegevensuitwisseling tussen coroutines mogelijk.
  • Mutex: Synchronisatieprimitive voor het beschermen van kritieke secties.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Voorbeeld van gebruik van coroutines en dispatcher
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Werkende coroutine: $i")
            delay(100) // Niet-blokkerende vertraging
        }
    }
    println("Coroutine gestart")
    job.join() // Wacht tot de coroutine klaar is
    println("Coroutine voltooid")
}
// Voorbeeld suspend-functie
suspend fun fetchData(): String {
    delay(1000) // Simulatie van een netwerkverzoek
    return "Data ontvangen"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

suspend fun incrementCounter() {
    mutex.withLock {
        counter++
    }
}