Was ist eine Coroutine in Kotlin und wie funktioniert sie?
sobes.tech KI
Antwort von AI
Die Coroutine in Kotlin ist eine leichte Ausführungseinheit, die es ermöglicht, asynchronen, nicht blockierenden Code auf eine lesbarere und sequenzielle Weise zu schreiben. Sie ähnelt einem Thread, ist aber viel leichter und kann in großer Anzahl erstellt werden.
Hauptkomponenten und Funktionsprinzipien:
- Suspend-Funktionen: Funktionen, die mit dem Schlüsselwort
suspendmarkiert sind und ihre Ausführung aussetzen können, ohne den Thread zu blockieren, in dem sie ausgeführt werden. Wenn eine suspendierte Funktion ihre "Warte"-Operation (z.B. eine Netzwerkanfrage) beendet, kann sie die Ausführung an der Stelle wieder aufnehmen, an der sie unterbrochen wurde. - Kontext (Coroutine-Kontext): Eine Sammlung von Elementen, die das Verhalten der Coroutine steuern. Dazu gehören:
Job: Deskriptor der Coroutine, der die Steuerung ihres Lebenszyklus (Abbruch, Warten auf Abschluss) ermöglicht.CoroutineDispatcher: Bestimmt den Thread/die Threads, auf denen die Coroutine ausgeführt wird. Ermöglicht das Wechseln zwischen Threads.CoroutineName: Optionaler Name für Debugging.CoroutineExceptionHandler: Handler für unbehandelte Ausnahmen.
- Builder (Erbauer): Funktionen, die die Ausführung von Coroutines starten:
launch: Startet eine neue Coroutine, ohne ein Ergebnis zurückzugeben. Gibt einJobzurück.async: Startet eine neue Coroutine, die ein Ergebnis (Deferred) zurückgibt. Das Ergebnis wird mit.await()abgerufen.runBlocking: Blockierender Builder, hauptsächlich für Tests oder die Integration mit blockierendem Code.
Funktionsweise im Hintergrund:
Coroutines erstellen keine separaten Threads für jede Aufgabe. Stattdessen speichert der Compiler bei der Aussetzung einer suspend-Funktion den aktuellen Zustand der Berechnungen. Wenn das Ergebnis verfügbar ist, wird die Coroutine auf einem der von CoroutineDispatcher verwalteten Threads wieder aufgenommen. Dies wird erreicht, indem suspend-Funktionen in asynchrone Aufrufe mit Continuations umgewandelt werden, was es einem Thread ermöglicht, mehrere Coroutines auszuführen, zwischen ihnen zu wechseln, wenn sie ausgesetzt werden.
Beispiel:
import kotlinx.coroutines.*
fun main() = runBlocking { // Blockiert den aktuellen Thread bis zum Abschluss der Coroutine in runBlocking
println("Zuerst")
launch { // Startet eine neue Coroutine im Hintergrund
delay(1000L) // Nicht blockierende Verzögerung von 1 Sekunde
println("Nach der Verzögerung")
}
println("Dann") // Diese Zeile wird vor Abschluss der launch-Coroutine ausgeführt
}
Ausgabe:
Zuerst
Dann
Nach der Verzögerung
Dies demonstriert die nicht-blockierende Natur von launch und delay.