web-dev-qa-db-fra.com

Comment initialiser un fil dans Kotlin?

En Java, cela fonctionne en acceptant un objet qui implémente runnable:

Thread myThread = new Thread(new myRunnable())

myRunnable est une classe implémentant Runnable

Mais lorsque j'ai essayé cela à Kotlin, cela ne semble pas fonctionner:

var myThread:Thread = myRunnable:Runnable
15
Shubhranshu Jain

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.

15
s1m0nw1

J'ai fait ce qui suit et il semble fonctionner comme prévu.

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

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()}")
    }
2
Rajesh Dalsaniya

S'il vous plaît essayez ce code:

Thread().run { Thread.sleep(3000); }
1
Hardeep singh
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)
}
0
geekowll

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.

0
Alexey Soshin