Categories: Coroutines

Iniciar una Corrutina

Share

En la entrada anterior puedes ver cuales son las dependencias para poder usar una corrutina en tu proyecto.

La principal forma de iniciar una corrutina es con coroutine builder launch en un contexto de algún CoroutineScope. Vamos a verlo con varios ejemplos.

import kotlinx.coroutines.*

fun main() {
//sampleStart
    GlobalScope.launch {
        delay(1000L) // retraso non-blocking de 1 segundo
        println("World!") // Mostramos al terminar el delay
    }
    println("Hello,") // Mientras la corrutina se ejecuta, el hilo principal sigue
    Thread.sleep(2000L) // Bloqueo del hilo priincpal durante 2 segundos para mantener vivo el JVM
//sampleEnd
}

Como vemos se muestra primero "Hello,", eso es porque mostrar "World!" tardará al menos 1 segundo. Si no utilizásemos Thread.sleep(2000L), se terminaría la ejecución de la aplicación antes de que finalizase la corrutina.

Podemos sustituir este Thread.sleep por runBlocking (este solo se debe utilizar para pruebas) para evitar tener que calcular cuanto tiempo debería bloquearse el hilo principal en función de la duración de la corrutina.

import kotlinx.coroutines.*

//sampleStart
fun main() = runBlocking {
    launch {
        delay(1000L) // retraso non-blocking de 1 segundo
        println("World!") // Mostramos al terminar el delay
    }
    println("Hello,") // Mientras la corrutina se ejecuta, el hilo principal sigue
}
//sampleEnd

Es más, podemos ejecutar varias en paralelo. Por ejemplo dos corrutinas que tardarían en finalizar 1 segundo una y 2 segundos otra, tendrán una duración total de 2 segundos, y no de 3 segundos, ya que la primera finalizaría cuando la segunda llevase 1 segundo, por lo que solo habría que esperar otro segundo más.

import kotlinx.coroutines.*
import kotlin.system.measureTimeMillis

fun main() = runBlocking {
//sampleStart
    val time = measureTimeMillis {
        val job1 = launch {
            delay(2000L)
            println("World!")
        }
        val job2 = launch {
            delay(1000L)
            println("Hello, ")
        }
        joinAll(job1, job2)
    }
    println("Time: $time") // ~= 2000ms
//sampleEnd
}

Como habrás visto, hemos añadido algo nuevo: Job. Pero de eso hablaremos en la siguiente entrada.


Enlaces de interés:

Recent Posts

  • Curso Interactivo

Variables

En esta lección aprenderás a declarar variables y los tipos básicos.

5 años ago
  • Curso Interactivo

Introducción al Curso Interactivo

La mejor forma de aprender algo en esta vida es a base de practicar. Espero…

5 años ago
  • Coroutines

Coroutines

Las coroutines en Kotlin vienen a tratar de solucionar todos los problemas y dificultades que…

5 años ago
  • Funciones Estándar

Resumen Elección de Modismo

Con este esquema te puedes guiar a la hora de elegir el modismo o función…

5 años ago
  • Funciones Estándar

With

El último que queda por ver es with qué en inglés significa "con". Por lo…

5 años ago
  • Funciones Estándar

Run

Con run a diferencia de apply no se devuelve el objeto si no que devuelve…

5 años ago