109 votes

Quand appelleriez-vous java ' s thread.run() au lieu de thread.start() ?

... la question dit tout je crois !

113voto

Paul Croarkin Points 5845

Vous pouvez appeler run() dans un test d’unité particulière qui vise strictement avec fonctionnalité et pas d’accès concurrentiel.

95voto

Adam Crume Points 7444

Jamais. Composant le run() directement juste exécute le code de façon synchrone (dans le même thread), tout comme un appel de méthode normal.

27voto

Tomalak Points 150423

Pris forme le Style de Code Java threads FAQ:

Q: Quelle est la différence entre un thread start() et run() méthodes?

Un: Le départ séparé() et run() méthodes de la classe Thread fournir deux façons de créer un programme multi-threadé. La méthode start() commence l' l'exécution de la nouvelle fil et les appels la méthode run (). La méthode start() retourne immédiatement et le nouveau thread normalement continue jusqu'à ce que le run() méthode retourne.

La classe Thread' méthode run() ne fait rien, afin que les sous-classes doivent remplacer la méthode avec le code de exécuter dans le deuxième thread. Si un Thread est instancié avec un Exécutable argument, le fil de la méthode run() exécute la méthode run() de la L'objet praticable dans le nouveau thread au lieu de cela.

Selon la nature de votre programme multi-threadé, appelant le Fil méthode run() directement, peut donner l' même sortie que des appels via la start() la méthode, mais dans ce dernier cas, l' le code est exécuté dans une nouvelle fil de discussion.

24voto

Mahendra Points 2298

L'exécution d' thread.run() ne pas créer un nouveau Fil de discussion dans lequel votre code est exécuté... Ça exécute le code dans l' currentThread à partir de laquelle le thread.run() code est invoquée.

L'exécution d' thread.start() crée un nouveau niveau de l'OS thread dans lequel l' run() méthode est appelée.

Dans essense:

Single Threaded programming ==> Directly calling the `run()` method
Multi Threaded programming ==> Calling the `start()` method

En outre, comme d'autres l'ont mentionné, "essais" semble être la seule conseillé cas où vous peut invoquer run() directement à partir de votre code.

Espérons que ça aide!

13voto

Scott Bale Points 4385

Cela a déjà été fait allusion, mais juste pour être clair: la création d'un nouvel objet Thread uniquement à appeler la méthode run() est inutilement cher et devrait être un grand drapeau rouge. Il serait beaucoup mieux, plus découplée de la conception pour créer un Exécutable impl et soit (un) appel c'est méthode run() directement si c'est le comportement souhaité, ou (b) la construction d'un nouveau Thread avec qui Praticable et démarrer le Thread.

Mieux encore, pour encore plus de découplage, découvrez l' Executor interface et le cadre dans le JDK 5 ou plus récent. Cela vous permet, en un mot, pour découpler l'exécution de la tâche (l'Exécutable exemple) à partir de la façon dont il est exécuté (l'Exécuteur de la mise en œuvre, qui peut exécuter l'Exécutable dans le Thread en cours, dans un nouveau Thread, à l'aide d'un Fil de discussion existant à partir d'un pool, et autres joyeusetés).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X