Café y Código

14. Introducción a Coroutines ⚡

¿Qué son las Coroutines?

Las coroutines son la forma en que Kotlin maneja la concurrencia. Son como hilos, pero mucho más ligeras y fáciles de usar. No necesitas callbacks ni complejidad.

"Las coroutines son hilos que el compilador puede pausar y reanudar sin bloquear recursos."

Funções suspend

Una función suspend puede pausarse sin bloquear el hilo:

suspend.kt
KOTLIN
1 import kotlinx.coroutines.*
2 import kotlin.system.measureTimeMillis
3
4 suspend fun descargarDatos(): String {
5 delay(1000) // Pausa 1 segundo (no bloquea el hilo)
6 return "Datos descargados"
7 }
8
9 fun main() = runBlocking {
10 val tiempo = measureTimeMillis {
11 val datos = descargarDatos()
12 println(datos)
13 }
14 println("Tiempo: ${tiempo}ms") // ~1000ms
15 }

launch: Tareas en paralelo

launch lanza una tarea en segundo plano sin esperar que termine:

launch.kt
KOTLIN
1 import kotlinx.coroutines.*
2
3 fun main() = runBlocking {
4 // Lanza 3 tareas en paralelo
5 launch { println("Tarea 1: ${Thread.currentThread().name}") }
6 launch { println("Tarea 2: ${Thread.currentThread().name}") }
7 launch { println("Tarea 3: ${Thread.currentThread().name}") }
8
9 println("Tarea principal: ${Thread.currentThread().name}")
10 // Todo se ejecuta prácticamente al mismo tiempo
11 }

async: Obtener resultados

async retorna un Deferred con el resultado futuro:

async.kt
KOTLIN
1 import kotlinx.coroutines.*
2
3 suspend fun precioDolar(): Double {
4 delay(500)
5 return 950.0
6 }
7
8 suspend fun precioEuro(): Double {
9 delay(500)
10 return 1050.0
11 }
12
13 fun main() = runBlocking {
14 val tiempo = measureTimeMillis {
15 // En paralelo
16 val dolar = async { precioDolar() }
17 val euro = async { precioEuro() }
18
19 // Esperar resultados
20 println("Dolar: ${dolar.await()}")
21 println("Euro: ${euro.await()}")
22 }
23 println("Tiempo total: ${tiempo}ms") // ~500ms (no 1000ms)
24 }

withContext: Cambiar de coroutine

Cambia el contexto de ejecución (por ejemplo, para operaciones de IO):

withContext.kt
KOTLIN
1 import kotlinx.coroutines.*
2
3 fun main() = runBlocking {
4 val resultado = withContext(Dispatchers.Default) {
5 // Ejecutar en hilo de CPU
6 (1..1000).sum()
7 }
8 println("Suma: $resultado")
9 }

💻 Misión

Crea 3 funciones suspend que simulen descargar archivos (delay de diferentes duraciones). Usa async para ejecutarlas en paralelo y muestra el tiempo total vs secuencial.

👁️ Ver solución sugerida
main.kt
KOTLIN
1 import kotlinx.coroutines.*
2 import kotlin.system.measureTimeMillis
3
4 suspend fun descargar(nombre: String, ms: Long): String {
5 delay(ms)
6 return "$nombre descargado"
7 }
8
9 fun main() = runBlocking {
10 val tiempo = measureTimeMillis {
11 val a = async { descargar("Archivo1", 1000) }
12 val b = async { descargar("Archivo2", 1500) }
13 val c = async { descargar("Archivo3", 800) }
14
15 println(a.await())
16 println(b.await())
17 println(c.await())
18 }
19 println("Total en paralelo: ${tiempo}ms") // ~1500ms, no 3300ms
20 }

Pon a prueba tus coroutines

Ko-fi
Donaciones
Apoyá cafeycodigo con un café en Ko-fi. Colaboradores: insignia, muro y zona exclusiva.