Sobes.tech
Middle

Milyen mechanizmusokat kínál a Kotlin a párhuzamos számításokhoz?

sobes.tech MI

Válasz az MI-től

  • Koruletok (Coroutines): Könnyűsúlyú szálak, amelyek lehetővé teszik az aszinkron kód imperatív stílusban történő írását, elkerülve a blokkoló hívásokat. Újraindítható funkciókon alapulnak, és nem kötődnek natív szálakhoz.
  • Dispatchers: Meghatározzák azt a szálat vagy szálcsoportot, amelyen a korutina fut.
    • Dispatchers.Default: Erőforrás-igényes feladatokhoz (pl. CPU-bound).
    • Dispatchers.IO: Bemenet/kimenet műveletekhez (pl. hálózati kérések, fájlkezelés).
    • Dispatchers.Main: A kód végrehajtásához a fő szálon (pl. UI frissítés Android alkalmazásban).
    • Dispatchers.Unconfined: A korutina a jelenlegi szálon fut egészen az első suspend hívásig.
  • Suspend-függvények: Olyan funkciók, amelyeket szüneteltetni és később folytatni lehet. A suspend módosítóval vannak ellátva.
  • Context: Információkat tartalmaz a korutinról, például a dispatcher, a job és a kivételkezelő.
  • Job: A korutin életciklusát reprezentálja (indított, aktív, befejezett, törölt). Lehetővé teszi a korutin kezelését (törlés, várakozás a befejezésre).
  • Scope: Meghatározza a korutinok hatókörét, és kezeli azok életciklusát.
  • MutableStateFlow / SharedFlow: A kotlinx.coroutines.flow könyvtárban biztonságos adatcserét tesznek lehetővé a korutinok között.
  • Mutex: Szinkronizációs primitív a kritikus szekciók védelmére.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Példa korutin és dispatcher használatára
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Munkakorutina: $i")
            delay(100) // Nem blokkoló késleltetés
        }
    }
    println("Korutina indítva")
    job.join() // Várakozás a korutina befejezésére
    println("Korutina befejeződött")
}
// Suspend-függvény példája
suspend fun fetchData(): String {
    delay(1000) // Hálózati kérés szimulációja
    return "Adatok fogadva"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

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