En Java, cela fonctionne en acceptant un objet qui implémente runnable:
Thread myThread = new Thread(new myRunnable())
où myRunnable
est une classe implémentant Runnable
.
Mais lorsque j'ai essayé cela à Kotlin, cela ne semble pas fonctionner:
var myThread:Thread = myRunnable:Runnable
Pour initialiser un objet de Thread
, vous appelez simplement le constructeur:
val t = Thread()
Ensuite, vous pouvez également passer une Runnable
optionnelle avec un lambda (conversion SAM) comme ceci:
Thread {
Thread.sleep(1000)
println("test")
}
La version plus explicite passe une implémentation anonyme de Runnable
comme ceci:
Thread(Runnable {
Thread.sleep(1000)
println("test")
})
Notez que les exemples précédemment montrés ne font que créent une instance de Thread
mais ne la démarrent pas réellement. Pour cela, vous devez appeler explicitement start()
.
Enfin et surtout, vous devez connaître la fonction de bibliothèque standard thread
, que je vous recommanderais d'utiliser:
public fun thread(start: Boolean = true, isDaemon: Boolean = false, contextClassLoader: ClassLoader? = null, name: String? = null, priority: Int = -1, block: () -> Unit): Thread {
Vous pouvez l'utiliser comme ceci:
thread(start = true) {
Thread.sleep(1000)
println("test")
}
Il possède de nombreux paramètres facultatifs pour, par exemple, démarrer directement le fil comme indiqué ici.
J'ai fait ce qui suit et il semble fonctionner comme prévu.
Thread(Runnable {
//some method here
}).start()
Runnable:
val myRunnable = runnable {
}
Fil:
Thread({
// call runnable here
println("running from lambda: ${Thread.currentThread()}")
}).start()
Vous ne voyez pas de Runnable ici: dans Kotlin, il peut facilement être remplacé par une expression lambda. Y a-t-il un meilleur moyen? Sûr! Voici comment vous pouvez instancier et démarrer un style .ot. Kotlin:
thread(start = true) {
println("running from thread(): ${Thread.currentThread()}")
}
S'il vous plaît essayez ce code:
Thread().run { Thread.sleep(3000); }
fun main(args: Array<String>) {
Thread({
println("test1")
Thread.sleep(1000)
}).start()
val thread = object: Thread(){
override fun run(){
println("test2")
Thread.sleep(2000)
}
}
thread.start()
Thread.sleep(5000)
}
Le meilleur moyen serait d’utiliser la fonction de générateur thread()
de kotlin.concurrent
: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.concurrent/thread.html
Vous devriez vérifier ses valeurs par défaut, car elles sont très utiles:
thread() { /* do something */ }
Notez qu'il n'est pas nécessaire d'appeler start()
comme dans l'exemple de thread, ni de fournir start=true
.
Soyez prudent avec les threads qui durent longtemps. Il est utile de spécifier thread(isDaemon= true)
pour que votre application puisse se terminer correctement.