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
s1m0nw1
Kotlin viene con una función de biblioteca estándar thread
que 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 Thread
invoca 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
(porquestart
estrue
por defecto) y simplemente escribathread { 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
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()
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...")
}
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()
}
david callanan
thread { /* your code here */ }
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 variablemyThread
es de tipoThread
. y haciendomyRunnable:Runnable
no tiene ningún sentido lo que nunca. La inicialización de clases en Kotlin es muy similar a Java. solo quitas elnew
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
elY:y
parte no tiene sentido.– Mibac
30/09/2017 a las 18:52