Sobes.tech
Middle

Koje mehanizme pruža Kotlin za rad sa paralelnim izračunima?

sobes.tech АИ

Одговор од АИ

  • Korutine (Coroutines): Lagan lagani tokovi koji omogućavaju pisanje asinhronog koda u imperativnom stilu, izbegavajući blokirajuće pozive. Osnovani su na funkcijama koje se mogu ponovo pokrenuti i nisu povezani sa nativnim tokovima.
  • Dispatchers: Određuju tok ili skup tokova u kojima će se izvršiti korutina.
    • Dispatchers.Default: Za zadatke koji zahtevaju mnogo resursa (npr. CPU-bound).
    • Dispatchers.IO: Za operacije ulaza/izlaza (npr. mrežni zahtevi, rad sa fajlovima).
    • Dispatchers.Main: Za izvršavanje koda na glavnom thread-u (npr. ažuriranje UI u Android aplikaciji).
    • Dispatchers.Unconfined: Izvršava korutinu na trenutnom thread-u do prvog poziva suspend funkcije.
  • Suspend funkcije: Funkcije koje mogu biti pauzirane i nastavljene kasnije. Obeležene su modifikatorom suspend.
  • Context: Sadrži informacije o korutini, kao što su dispatcher, job i handler izuzetaka.
  • Job: Predstavlja životni ciklus korutine (pokrenuta, aktivna, završena, otkazana). Omogućava upravljanje korutinom (otkazivanje, čekanje na završetak).
  • Scope: Definiše opseg za korutine, upravljajući njihovim životnim ciklusom.
  • MutableStateFlow / SharedFlow: U biblioteci kotlinx.coroutines.flow, omogućavaju siguran razmenu podataka između korutina.
  • Mutex: Primitiv za sinhronizaciju za zaštitu kritičnih sekcija.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Primer korišćenja korutina i dispatcher-a
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Radna korutina: $i")
            delay(100) // Ne blokirajuće kašnjenje
        }
    }
    println("Pokrenuli smo korutinu")
    job.join() // Čekamo završetak korutine
    println("Korutina završena")
}
// Primer suspend funkcije
suspend fun fetchData(): String {
    delay(1000) // Simulacija mrežnog zahteva
    return "Podaci primljeni"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

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