¿Cómo inicializar un hilo en Kotlin?

3 minutos de lectura

Avatar de usuario de Shubhranshu Jain
Shubhranshu jainista

En Java funciona aceptando un objeto que implementa ejecutable:

Thread myThread = new Thread(new myRunnable())

dónde myRunnable es una clase que implementa Runnable.

Pero cuando probé esto en Kotlin, parece que no funciona:

var myThread:Thread = myRunnable:Runnable

  • var myThread = Thread(myRunnable())

    – Mibac

    30/09/2017 a las 17:57

  • @Mibac ¡Funcionó! ¿Pueden ayudarme a entender este fragmento de código?

    – Shubhranshu Jain

    30/09/2017 a las 18:04

  • Haciendo myThread:Thread dice esa variable myThread es de tipo Thread. y haciendo myRunnable:Runnable no tiene ningún sentido lo que nunca. La inicialización de clases en Kotlin es muy similar a Java. solo quitas el new palabra clave. Documentación relevante de Kotlin: a, b

    – Mibac

    30/09/2017 a las 18:05


  • Gracias. ¿Entonces el formato x:X funciona para las clases pero no para las interfaces?

    – Shubhranshu Jain

    30 de septiembre de 2017 a las 18:19

  • Funciona para interfaces, pero cuando lo hace x = Y:y el Y:y parte no tiene sentido.

    – Mibac

    30/09/2017 a las 18:52

avatar de usuario de s1m0nw1
s1m0nw1

Kotlin viene con una función de biblioteca estándar threadque recomendaría usar aquí:

public fun thread(
    start: Boolean = true, 
    isDaemon: Boolean = false, 
    contextClassLoader: ClassLoader? = null, 
    name: String? = null, 
    priority: Int = -1, 
    block: () -> Unit): Thread

Puedes usarlo así:

thread {
    Thread.sleep(1000)
    println("test")
}

Tiene muchos parámetros opcionales para, por ejemplo, no iniciar el hilo directamente configurando start a false.


Alternativas

Para inicializar una instancia de clase Threadinvoca a su constructor:

val t = Thread()

También puede pasar un opcional Runnable como lambda (conversión SAM) de la siguiente manera:

Thread {
    Thread.sleep(1000)
    println("test")
}

La versión más explícita pasaría una implementación anónima de Runnable como esto:

Thread(Runnable {
    Thread.sleep(1000)
    println("test")
})

Tenga en cuenta que los ejemplos mostrados anteriormente solo crear una instancia de un Thread pero en realidad no lo inicies. Para lograr eso, necesitas invocar start() explícitamente.

  • Tenga en cuenta que puede omitir start = true (porque start es true por defecto) y simplemente escriba thread { Thread.sleep(1000) } para empezar hilo.

    – Ilya Serbia

    27 de mayo de 2019 a las 8:30

  • He añadido una nota sobre esto para que sea más obvio, gracias

    – s1m0nw1

    27 de mayo de 2019 a las 9:57

Avatar de usuario de Rajesh Dalsaniya
Rajesh Dalsaniya

Ejecutable:

val myRunnable = runnable {

}

Hilo:

Thread({  
// call runnable here
  println("running from lambda: ${Thread.currentThread()}")
}).start()

No ves un Runnable aquí: en Kotlin se puede reemplazar fácilmente con una expresión lambda. ¿Hay una mejor manera? ¡Seguro! Así es como puede crear una instancia e iniciar un hilo al estilo Kotlin:

thread(start = true) {  
      println("running from thread(): ${Thread.currentThread()}")
    }

  • @Mibac proporcioné más opciones

    – Rajesh Dalsaniya

    30/09/2017 a las 18:53

Hice lo siguiente y parece estar funcionando como se esperaba.

Thread(Runnable {
            //some method here
        }).start()

Avatar de usuario de Alexey Soshin
Alexei Soshin

La mejor manera sería usar thread() función generadora de kotlin.concurrent:
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html

Debe verificar sus valores predeterminados, ya que son bastante útiles:

thread() { /* do something */ }

Tenga en cuenta que no necesita llamar start() como en el ejemplo de Thread, o proporcionar start=true.

Tenga cuidado con los subprocesos que se ejecutan durante un largo período de tiempo. Es útil especificar thread(isDaemon= true) para que su aplicación pueda terminar correctamente.

Por lo general, la aplicación esperará hasta que finalicen todos los subprocesos que no sean demonios.

En primer lugar, cree una función para establecer la propiedad predeterminada

fun thread(
  start: Boolean = true, 
  isDaemon: Boolean = false, 
  contextClassLoader: ClassLoader? = null, 
  name: String? = null, 
  priority: Int = -1, 
  block: () -> Unit
): Thread

luego realice una operación en segundo plano llamando a esta función

thread(start = true) {
     //Do background tasks...
}

O las rutinas de kotlin también se pueden usar para realizar tareas en segundo plano

GlobalScope.launch {

    //TODO("do background task...")
    withContext(Dispatchers.Main) {
        // TODO("Update UI")
    }
    //TODO("do background task...")
}

Obtener el avatar de usuario de Thakur
Get Thakur

Ejemplo básico de Thread con Lamda

fun main() {
    val mylamda = Thread({
        for (x in 0..10){
            Thread.sleep(200)
            println("$x")
        }
   })
    startThread(mylamda)

}

fun startThread(mylamda: Thread) {
    mylamda.start()
}

Avatar de usuario de David Callanan
david callanan

thread { /* your code here */ }

¿Ha sido útil esta solución?