Coroutines for Kotlin: Complete Guide with Examples

Online Python Trainer for Beginners

Learn Python easily without overwhelming theory. Solve practical tasks with automatic checking, get hints in Russian, and write code directly in your browser — no installation required.

Start Course

What are Coroutines and why are they needed?



Coroutines are a powerful tool for asynchronous programming in Kotlin that allows you to write non-blocking code in an imperative style. Unlike traditional threads, coroutines are lightweight: you can launch thousands of coroutines on a single thread without significant memory consumption.



The main purpose of Coroutines is to simplify working with asynchronous operations: network requests, database reads, file operations, and other tasks that require waiting. Instead of using complex callbacks or reactive streams, you write sequential code that suspends while waiting and resumes after the operation completes.



The Coroutines library is part of the Kotlin ecosystem and is officially supported by JetBrains. It is widely used in Android development, server applications (Ktor, Spring WebFlux), and even desktop applications.



Installing Coroutines



Since Coroutines is not a separate library to install via pip or npm, but rather part of the Kotlin ecosystem, adding it depends on your build manager.



Gradle (Kotlin DSL)

dependencies {    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0")    // For Android or using Dispatchers.Main    implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0")}


Gradle (Groovy DSL)

dependencies {    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.9.0'    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'}


Maven

<dependency>    <groupId>org.jetbrains.kotlinx</groupId>    <artifactId>kotlinx-coroutines-core</artifactId>    <version>1.9.0</version></dependency>


Quick Start: First Example



Let's write a simple program that launches a coroutine, pauses, and prints a message:



import kotlinx.coroutines.*

fun main() = runBlocking { println("Program start: ${Thread.currentThread().name}") launch { delay(1000L) // Suspend the coroutine for 1 second (without blocking the thread) println("World! (from coroutine: ${Thread.currentThread().name})") } println("Hello, (from main: ${Thread.currentThread().name})") delay(500L) // Wait so the coroutine has time to execute println("End of program")}


Output:

Program start: main @coroutine#1Hello, (from main: @coroutine#1)World! (from coroutine: @coroutine#2)End of program


Note: delay() does not block the thread, it only suspends the current coroutine. The main thread remains free for other tasks.



Main Coroutines Methods and Functions



1. runBlocking

What it does: Launches a new coroutine and blocks the current thread until its completion. Used as a bridge between regular synchronous code and the coroutine world (usually in main functions or tests).

Parameters:

  • context: CoroutineContext — coroutine context (default is EmptyCoroutineContext)
  • block: suspend CoroutineScope.() -> T — suspend block to be executed

Example:

fun main() {    val result = runBlocking {        delay(1000L)        "Done!"    }    println(result) // Outputs: Done!}


2. launch

What it does: Launches a new coroutine that does not return a result (fire-and-forget analog). Returns a Job object that can be used for cancellation or waiting.

Parameters:

  • context: CoroutineContext

Recommendations