Sobes.tech
Middle

Jakie mechanizmy oferuje Kotlin do pracy z obliczeniami równoległymi?

sobes.tech AI

Odpowiedź od AI

  • Koruzy (Coroutines): Lekkie wątki, które pozwalają pisać kod asynchroniczny w stylu imperatywnym, unikając wywołań blokujących. Oparte na funkcjach wznawialnych i nie są powiązane z natywnymi wątkami.
  • Dispatchers: Określają wątek lub pulę wątków, na którym będzie wykonywana korutyna.
    • Dispatchers.Default: Dla zadań zasobożernych (np. CPU-bound).
    • Dispatchers.IO: Dla operacji wejścia/wyjścia (np. żądania sieciowe, praca z plikami).
    • Dispatchers.Main: Do wykonywania kodu na głównym wątku (np. aktualizacja UI w aplikacji Android).
    • Dispatchers.Unconfined: Wykonuje korutynę na bieżącym wątku do pierwszego wywołania funkcji suspend.
  • Funkcje suspend: Funkcje, które można zawiesić i wznowić później. Oznaczone modyfikatorem suspend.
  • Context: Zawiera informacje o korutynie, takie jak dispatcher, job i obsługiwacz wyjątków.
  • Job: Reprezentuje cykl życia korutyny (uruchomiona, aktywna, zakończona, anulowana). Pozwala zarządzać korutyną (anulować, czekać na zakończenie).
  • Scope: Określa zakres dla korutyn, zarządzając ich cyklem życia.
  • MutableStateFlow / SharedFlow: W bibliotece kotlinx.coroutines.flow, umożliwiają bezpieczną wymianę danych między korutynami.
  • Mutex: Prymityw synchronizacji do ochrony sekcji krytycznych.
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Przykład użycia korutyn i dispatcher
    val job = launch(Dispatchers.Default) {
        repeat(5) { i ->
            println("Robocza korutyna: $i")
            delay(100) // Nieblokujące opóźnienie
        }
    }
    println("Uruchomiono korutynę")
    job.join() // Czekanie na zakończenie korutyny
    println("Korutyna zakończona")
}
// Przykład funkcji suspend
suspend fun fetchData(): String {
    delay(1000) // Symulacja żądania sieciowego
    return "Dane odebrane"
}
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock

val mutex = Mutex()
var counter = 0

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