Différence entre la méthode Start et Run dans les threads en Java
Pour démarrer un thread en Java, on appelle la méthode start() de la classe java.lang.Thread, mais si vous en apprenez plus, vous découvrirez que la méthode start() appelle en interne la méthode run() de l’interface Runnable pour exécuter le code spécifié dans la méthode. Maintenant, la question se pose: pourquoi nous ne pouvons pas simplement appeler la méthode run() au lieu d’appeler la méthode start()? Puisque start() appelle quand même run(), Si nous appelons directement run, est-ce que ça devrait avoir le même effet que d’appeler start?
Lorsque vous appelez directement la méthode run(), le code de la méthode run() est exécuté dans le même thread qui appelle la méthode run. JVM ne créera pas de nouveau thread jusqu’à ce que vous appeliez la méthode start().
En revanche, lorsque vous appelez la méthode Thread.start(), le code dans la méthode run() est exécuté sur un nouveau thread, qui est en fait créé par la méthode start().
Une autre différence à retenir entre les méthodes start et run est que vous pouvez appeler la méthode run() plusieurs fois. JVM ne renvoie aucune erreur, mais vous ne pouvez pas appeler la méthode start() sur la même instance de thread.
Code normal appelant la méthode start() sur un thread
public class MaClasse extends Thread { public void run() { System.out.println("Etat du thread: " + this.isAlive()); } public static void main(String args[]) { MaClasse th = new MaClasse(); th.start(); } }
La sortie :
Etat du thread: true
Code anormal appelant la méthode run() sur un thread
public class MaClasse extends Thread { public void run() { System.out.println("Etat du thread: " + this.isAlive()); } public static void main(String args[]) { MaClasse th = new MaClasse(); th.run(); } }
La sortie :
Etat du thread: false
Avec la méthode start(), la méthode thread isAlive() renvoie true et avec la méthode run(), la méthode isAlive() renvoie false. Qu’est-ce que cela indique? dans les deux cas, thread est créé et run() est appelé. Avec le cas de start(), la machine virtuelle Java (JVM) appelle de manière implicite la méthode run(), le thread th étant exécuté. Pour cela, isAlive() retourne true. Si start() est appelé, la machine virtuelle Java (JVM) garde le cycle de vie du thread et effectue de nombreuses activités sur le thread qui est éligible.
En appelant directement la méthode run() en tant que th.run(), dans le deuxiéme cas, cela équivaut simplement à un appel de méthode normal. Dans th.run(), th est supposé, par la JVM, en tant qu’objet de la classe « MaClasse » mais pas en tant que thread de la classe « MaClasse ». En d’autres termes, run() n’est ni appelé ni exécuté par un thread. Pour cette raison, isAlive() a renvoyé la valeur false.
Utilisez donc toujours start()
et non run()
.
Nous appelons start() sur un objet Thread pour démarrer un nouveau thread. Lorsque le thread démarre, la méthode run() est appelée dans un nouveau thread.
En règle générale, vous ne devez pas invoquer run() vous-même.
Conclusion
La seule différence entre la méthode start() et run() dans les Threads est que la méthode start crée un nouveau thread alors que run ne crée aucun thread et s’exécute simplement dans le thread actuel comme un appel de méthode normal.