Was sind Coroutines und warum werden sie benötigt?
\n\nCoroutines (Koroutinen) sind ein leistungsstarkes Werkzeug für asynchrone Programmierung in Kotlin, das es ermöglicht, nicht-blockierenden Code in einem imperativen Stil zu schreiben. Im Gegensatz zu traditionellen Threads sind Koroutinen leichtgewichtig: Sie können Tausende von Koroutinen in einem einzigen Thread ausführen, ohne nennenswerten Speicherverbrauch.
\n\nDie Hauptaufgabe von Coroutines ist es, die Arbeit mit asynchronen Operationen zu vereinfachen: Netzwerkanfragen, Datenbanklesevorgänge, Dateioperationen und andere Aufgaben, die Wartezeiten erfordern. Anstatt komplexe Callbacks oder reaktive Streams zu verwenden, schreiben Sie sequenziellen Code, der während des Wartens pausiert und nach Abschluss der Operation fortgesetzt wird.
\n\nDie Coroutines-Bibliothek ist Teil des Kotlin-Ökosystems und wird offiziell von JetBrains unterstützt. Sie wird häufig in der Android-Entwicklung, bei Serveranwendungen (Ktor, Spring WebFlux) und sogar in Desktop-Anwendungen eingesetzt.
\n\nInstallation von Coroutines
\n\nDa Coroutines keine separate Bibliothek ist, die über pip oder npm installiert wird, sondern Teil des Kotlin-Ökosystems, hängt die Einbindung von Ihrem Build-Manager ab.
\n\nGradle (Kotlin DSL)
\ndependencies {\n implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")\n // Für Android oder die Verwendung von Dispatchers.Main\n implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0")\n}\n\nGradle (Groovy DSL)
\ndependencies {\n implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0'\n implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'\n}\n\nMaven
\n<dependency>\n <groupId>org.jetbrains.kotlinx</groupId>\n <artifactId>kotlinx-coroutines-core</artifactId>\n <version>1.9.0</version>\n</dependency>\n\nSchnellstart: Erstes Beispiel
\n\nLassen Sie uns ein einfaches Programm schreiben, das eine Koroutine startet, eine Pause macht und eine Nachricht ausgibt:
\n\nimport kotlinx.coroutines.*\n\nfun main() = runBlocking {\n println("Programmstart: ${Thread.currentThread().name}")\n \n launch {\n delay(1000L) // Koroutine für 1 Sekunde pausieren (ohne den Thread zu blockieren)\n println("Welt! (aus Koroutine: ${Thread.currentThread().name})")\n }\n \n println("Hallo, (aus main: ${Thread.currentThread().name})")\n delay(500L) // Warten, damit die Koroutine ausgeführt werden kann\n println("Programmende")\n}\n\nAusgabe:
\nProgrammstart: main @coroutine#1\nHallo, (aus main: @coroutine#1)\nWelt! (aus Koroutine: @coroutine#2)\nProgrammende\n\nBeachten Sie: delay() blockiert nicht den Thread, sondern pausiert nur die aktuelle Koroutine. Der main-Thread bleibt für andere Aufgaben frei.
Grundlegende Methoden und Funktionen von Coroutines
\n\n1. runBlocking
\nWas es tut: Startet eine neue Koroutine und blockiert den aktuellen Thread bis zu deren Abschluss. Wird als Brücke zwischen normalem synchronem Code und der Welt der Koroutinen verwendet (normalerweise in der main-Funktion oder in Tests).
\nParameter:
\n- \n
context: CoroutineContext— Kontext der Koroutine (standardmäßig EmptyCoroutineContext) \n block: suspend CoroutineScope.() -> T— suspend-Block, der ausgeführt wird \n
Beispiel:
\nfun main() {\n val result = runBlocking {\n delay(1000L)\n "Fertig!"\n }\n println(result) // Gibt aus: Fertig!\n}\n\n2. launch
\nWas es tut: Startet eine neue Koroutine, die kein Ergebnis zurückgibt (Analogon zu Fire-and-Forget). Gibt ein Job-Objekt zurück, das zum Abbrechen oder Warten verwendet werden kann.
\nParameter:
\n- \n
context: CoroutineContext