Pourquoi ne pouvons-nous pas appeler directement la méthode run ()?
Si la méthode start() du thread appelle en interne la méthode run (), alors pourquoi ne pas nous appeler directement la méthode run() dans notre code? Quels en sont les enjeux?
source d'informationauteur n_g
Vous devez vous connecter pour publier un commentaire.
La
start
méthode permet de s'assurer que le code s'exécute dans un nouveau contexte de thread. Si vous avez appelérun
directement, alors qu'il serait comme un ordinaire de l'appel de méthode et il s'exécute dans le contexte de la actuel fil au lieu de le nouveau. Lestart
méthode contient le code spécial pour déclencher le nouveau thread;run
évidemment n'ont pas cette capacité, parce que vous ne comprend pas quand vous avez écrit lerun
méthode.Lorsque nous appelons la méthode start() sur un objet thread, la méthode start() démarre un nouveau thread d'exécution par la création d'une nouvelle pile d'appel pour le thread .La start() sont les causes de ce thread pour commencer l'exécution et la Machine Virtuelle Java appelle la méthode run() de ce fil.
Que faire si nous appelons run() au lieu de démarrer() :
Si c'est légal, mais la méthode run() va dans la pile d'appel en cours au lieu de créer une nouvelle pile d'appel.
Par exemple, si la méthode actuelle d'être exécuté principal est alors la pile d'appel créées sont:
Pile d'appel pour un nouveau thread (méthode start() créé une nouvelle pile d'appel)
Pile d'appel - Thread principal
}
méthode run() ne crée pas une nouvelle pile d'appel pour le thread. méthode run() va dans la pile d'appel en cours
Appel
run
exécute le code de manière synchrone; considérant qu'en permettant à la JVM pour appelerrun
viastart
permettrait le code à exécuter de manière asynchrone.Appel
run
directement est souvent bénéfique dans une situation de test où le filetage peut vouloir être évitée.Parce que
start()
va le faire comme un thread séparé. Si vous avez été de simplement appelerrun()
qui serait partie de votre thread (c'est à dire, un appel de fonction).Et, étant donné que votre thread peut être une boucle infinie d'attente pour le travail, ce serait un mauvaise chose.
Copie & Collez code ci-dessus ...puis lancez-le,,,et voir la différence en sortie..
Fondamentalement run() juste exceute son corps dans le contexte du thread actuel (qui est la principale ici)
Mais,
start() faire un appel à l'OS pour créer un nouveau thread.
start() va invoquer la méthode run() dans le contexte de la nouvellement créée fil.
L'appel de la méthode run directement va exécuter ce code dans le thread principal.
Alors c'est comme si votre programme sera d'avoir un seul thread (j'.e thread principal donné par O. S).
Si vous appelez la méthode start, qui feront appel couche de pilote thread manager pour créer un thread pour vous, et à partir de là, votre course de la fonction sera appelée. Et donc votre méthode de course sera exécutée dans un thread séparé. Pas dans le thread principal.
L'idée derrière le fil est de créer une nouvelle pile à chaque fois nouveau thread commence à courir.
L'invocation de la méthode run() du thread principal, la méthode run() va sur la pile d'appel en cours plutôt qu'au début d'une nouvelle pile d'appel.
Exaple pour le problème si vous appelez directement méthode run ():
De sortie:
Bien que l'appel de
run()
directement est légal, mais il va à l'encontre du but de multi-threading. Un thread fonctionne de manière indépendante par le fait d'avoir sa propre pile d'appel, si nous n'utilisons pas destart()
méthode que l'exécution de la pile pour que la déclaration serait la pile en cours à travers lequel cette déclaration est en cours d'exécution (main()
méthode dans la plupart des cas). Cela va à l'encontre du but de l'exécution d'un travail en même temps lors de notremain()
méthode ou en d'autres termes primaires de la pile est en cours d'exécution.