Sobes.tech
Middle

Jakie główne klasy istnieją w Kotlin Coroutines?

sobes.tech AI

Odpowiedź od AI

Główne klasy i koncepcje w Kotlin Coroutines:

  • CoroutineScope: Definiuje cykl życia korutyn uruchomionych w jego obrębie. Umożliwia anulowanie wszystkich korutyn potomnych.

  • Job: Reprezentuje uchwyt do korutyny. Pozwala śledzić jej stan, oczekiwać na jej zakończenie, anulować ją.

  • Deferred: Specjalny typ Job, reprezentujący wartość, która będzie dostępna później. Używany do asynchronicznych obliczeń zwracających wynik. Wynik można uzyskać za pomocą funkcji .await().

  • Dispatcher: Definiuje wątek lub pulę wątków, na którym wykonywana jest korutyna. Główne dispatcher:

    • Dispatchers.Default: Optymalizowany dla zadań intensywnych CPU. Używa wspólnej puli wątków.
    • Dispatchers.IO: Optymalizowany dla operacji I/O (sieć, dysk). Używa odpowiedniej liczby wątków.
    • Dispatchers.Main: Główny wątek UI. Do aktualizacji UI. Dostępny na platformie Android i innych z odpowiednim zależnością.
    • Dispatchers.Unconfined: Uruchamia korutynę w bieżącym wątku, ale wznawia ją w dowolnym wątku, który wznowił funkcję suspending.
  • Suspending function: Funkcja oznaczona słowem kluczowym suspend, która może być zawieszona i wznowiona później. Może wywoływać inne funkcje suspending.

  • runBlocking: Blokuje bieżący wątek do czasu zakończenia wszystkich korutyn w jej zakresie. Używany głównie do testów i w funkcji main.

  • launch: Uruchamia nową korutynę bez blokowania bieżącego wątku i zwraca Job.

  • async: Uruchamia nową korutynę bez blokowania bieżącego wątku i zwraca Deferred.

Przykład użycia:

// Przykład użycia CoroutineScope, launch i Dispatchers.IO
import kotlinx.coroutines.*

fun main() = runBlocking {
    // Tworzenie CoroutineScope
    val scope = CoroutineScope(Dispatchers.IO)

    // Uruchomienie korutyny w dispatcherze IO
    val job: Job = scope.launch {
        // Wykonanie żądania sieciowego lub innej operacji I/O
        delay(1000) // Symulacja pracy
        println("Korutyna zakończona w ${Thread.currentThread().name}")
    }

    // Czekanie na zakończenie korutyny
    job.join()
    println("Funkcja main zakończona")
}
// Przykład użycia async i Deferred
import kotlinx.coroutines.*

fun main() = runBlocking {
    val deferredSum: Deferred<Int> = async {
        delay(500)
        1 + 1
    }

    // Czekanie na wynik
    val result = deferredSum.await()
    println("Wynik to: $result")
}