@blank, La réponse est simplement: t.run()lorsque vous voulez exécuter tla tâche de sur le thread courant, et t.start()lorsque vous voulez exécuter tla tâche de la tâche sur le thread tlui-même. Ou demandez-vous des cas d'utilisation réels?
Pacerier
2
Lorsque vous êtes un idiot et que vous voulez passer une heure à déboguer du code multithread juste pour vous rendre compte plus tard que vous auriez dû appeler start()! Comme moi ... Cette méthode ne devrait pas être publique!
«Jamais» est un peu trop absolu. Vous ne voulez peut-être pas toujours un nouveau thread et exécutez toujours le code?
Tomalak
4
Peut-être, mais dans ce cas, il serait inutile de créer un nouveau Thread uniquement pour appeler la méthode run (). Mieux vaut créer un impl Runnable et exécuter ce thread ou construire et démarrer un nouveau thread avec.
Scott Bale
1
Juste revisiter ... sinon, pourquoi la méthode est-elle publique?
vide le
4
Il est public car Thread implémente Runnable. Vous pouvez sous-classer Thread et surcharger run (), ce qui a le même effet que de placer votre code dans un Runnable et de le transmettre au constructeur Thread. Cependant, il est préférable d'utiliser un objet Runnable séparé, car cela vous laisse plus de flexibilité (comme le transmettre à un exécuteur, etc.).
Adam Crume
2
Permettez-moi de donner un exemple concret avec lequel je travaille actuellement: j'ai un programme qui peut être exécuté en tant qu'interface graphique ou à partir de la ligne de commande. Dans le cas de l'interface graphique, je veux que l'objet qui fait le gros du travail s'exécute sur un thread séparé et envoie des mises à jour à l'interface graphique. En mode ligne de commande, je n'ai pas besoin de ce thread séparé.
Q: Quelle est la différence entre les méthodes start () et run () d'un thread?
R: Les méthodes distinctes start () et run () de la classe Thread fournissent deux façons de créer des programmes threadés. La méthode start () démarre l'exécution du nouveau thread et appelle la méthode run (). La méthode start () retourne immédiatement et le nouveau thread continue normalement jusqu'au retour de la méthode run ().
La méthode run () de la classe Thread ne fait rien, donc les sous-classes doivent remplacer la méthode avec du code à exécuter dans le deuxième thread. Si un Thread est instancié avec un argument Runnable, la méthode run () du thread exécute à la place la méthode run () de l'objet Runnable dans le nouveau thread.
Selon la nature de votre programme threadé, l'appel direct de la méthode Thread run () peut donner le même résultat que l'appel via la méthode start (), mais dans ce dernier cas, le code est en fait exécuté dans un nouveau thread.
thread's run() method executes the run() method of the Runnable object in the new thread instead.Ce n'est pas vrai (ou du moins mon code source Java 8 indique le contraire), mais malheureusement, le lien semble rompu, alors je signale l'erreur ici à la place.
kajacx
1
@Tomalak, cela ne répond pas à la question posée. La question n'est pas de demander la différence, mais de poser des questions sur les cas d'utilisation dans lesquels nous appellerons à la thread.run()place thread.start().
Pacerier du
24
L'exécution thread.run()ne crée pas de nouveau Threaddans lequel votre code est exécuté. Il exécute simplement le code dans le Thread actuel à partir duquel le thread.run()code est appelé.
L'exécution thread.start()crée un nouveau thread au niveau du système d'exploitation dans lequel la run()méthode est appelée.
En substance:
Programmation à un seul thread → Appel direct de la run()méthode
Programmation multithread → Appel de la start()méthode
De plus, comme d'autres l'ont mentionné, «tester» semble être le seul cas recommandé dans lequel vous pouvez invoquer run()directement à partir de votre code.
Cela a déjà été évoqué, mais juste pour être clair: créer un nouvel objet Thread uniquement pour appeler sa méthode run () est inutilement coûteux et devrait être un drapeau rouge majeur. Ce serait une conception bien meilleure et plus découplée pour créer un impl Runnable et soit (a) appeler sa méthode run () directement si c'est le comportement souhaité, soit (b) construire un nouveau Thread avec ce Runnable et démarrer le Thread.
Mieux encore, pour encore plus de découplage, consultez l' Executorinterface et le framework dans JDK 5 et plus récent. Cela vous permet, en un mot, de découpler l'exécution de la tâche (l'instance Runnable) de la façon dont elle est exécutée (l'implémentation Executor, qui peut exécuter le Runnable dans le Thread actuel, dans un nouveau Thread, en utilisant un Thread existant d'un pool, et ainsi de suite).
Appelez thread.start(), il appellera à son tour thread.run(). Je ne peux pas penser à un cas où vous voudriez contourner thread.start()et aller directement àthread.run()
Pendant les tests, c'est le seul cas légitime auquel je puisse penser. Sinon, le contenu de run () doit être dans une méthode distincte qui est appelée par run ou par d'autres moyens.
Bill the Lizard
9
Les méthodes distinctes start()et run()de la classe Thread fournissent deux méthodes pour créer des programmes threadés. La start()méthode démarre l'exécution du nouveau thread et appelle la run()méthode. La start()méthode retourne immédiatement et le nouveau thread continue normalement jusqu'à ce que la run()méthode retourne.
La run()méthode de la classe Thread ne fait rien, donc les sous-classes doivent remplacer la méthode avec du code à exécuter dans le deuxième thread. Si un thread est instancié avec un argument Runnable, la run()méthode du thread exécute la run()méthode de l'objet Runnable dans le nouveau thread à la place.
Selon la nature de votre programme threadé, l'appel run()direct de la méthode Thread peut donner le même résultat que l'appel via la start()méthode, mais dans ce dernier cas, le code est en fait exécuté dans un nouveau thread.
Identique à la réponse de Tomalak !! Si vous avez référencé d'un endroit, veuillez le mentionner !!
Barry
The start() method returns immediately and the new thread normally continues until the run() method returns.Si start()revient immédiatement, comment se fait-il que le run()continue de fonctionner étant donné qu'il a été appelé lui-même à partir destart()
KNU
7
Si la question était - "pourquoi la méthode de démarrage de thread est appelée au lieu de la méthode d'exécution directement" alors j'ai répondu avec un exemple de code ci-dessous. J'espère que cela clarifie. Dans l'exemple ci-dessous:
/*
By calling t1.start(),
we are getting the main calling thread returned immediately
after the t1.start() called and is ready to proceed for other
operations.And the thread t1 starts executing the run method of the object r.
Hence the the output will be:
I am the main thread , i created thread t1 and had it execute run method, which is currently looping from 0 to 1000000
I am done executing run method of testThread
*//* If we call t1.run() instead of t1.start(), (just replace t1.start() with t1.run() in the code for testing)
its like a regular method call and the main thread will not return until the run method completes,
hence the output will be:
I am done executing run method of testThread
I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000
*/class testThread implementsRunnable{publicvoid run(){for(int i=0;i<1000000;i++){}//a simple delay block to clarify.System.out.println("I am done executing run method of testThread");}}publicclass mainClass{publicstaticvoid main(String[] args){
testThread r =new testThread();Thread t1 =newThread(r);
t1.start();/* Question is: can we call instead t1.run() */System.out.println("I am the main thread , i created thread t1 and had it execute run method, which is currently looping for i to 1000000");}}
Lorsque vous souhaitez qu'il s'exécute de manière synchrone. L'appel de la méthode run ne vous donnera pas réellement de multi-threading. La méthode start crée un nouveau thread qui appelle la méthode run.
En supposant que vous connaissez l'utilisation de la méthode de démarrage et d'exécution, c.-à-d. Synchrone ou asynchrone; La méthode run peut être utilisée uniquement pour tester la fonctionnalité.
De plus, dans certaines circonstances, la même classe de thread peut être utilisée à deux endroits différents avec des exigences de fonctionnalité de synchronisation et d'asynchrone en ayant deux objets différents avec une méthode d'exécution et une autre méthode de démarrage appelée.
Au moins dans la JVM 1.6., Il y a un peu de vérification et l'exécution est appelée nativement:
publicsynchronizedvoid start(){/**
* This method is not invoked for the main method thread or "system"
* group threads created/set up by the VM. Any new functionality added
* to this method in the future may have to also be added to the VM.
*
* A zero status value corresponds to state "NEW".
*/if(threadStatus !=0)thrownewIllegalThreadStateException();
group.add(this);
start0();if(stopBeforeStart){
stop0(throwableFromStop);}}privatenativevoid start0();
Juste une note aux excellents commentaires ci-dessus: parfois vous écrivez un code multi-thread qui utilise la méthode "start" pour exécuter différents threads. Vous trouverez cela beaucoup plus facile si vous utilisez "run" (au lieu de "start) pour le débogage car cela permet au code de s'exécuter de manière synchrone et de le déboguer beaucoup plus facilement.
Salut Frnz, vérifiez et exécutez l'exemple ci-dessus pour comprendre clairement la première exécution avec t1.start () et voir le hashcode et la prochaine fois avec t1.run () et chk hashcodes
t.run()
lorsque vous voulez exécutert
la tâche de sur le thread courant, ett.start()
lorsque vous voulez exécutert
la tâche de la tâche sur le threadt
lui-même. Ou demandez-vous des cas d'utilisation réels?start()
! Comme moi ... Cette méthode ne devrait pas être publique!Réponses:
Vous voudrez peut-être appeler run () dans un test unitaire particulier qui concerne strictement la fonctionnalité et non la concurrence.
la source
Jamais. L'appel direct de run () exécute simplement le code de manière synchrone (dans le même thread), tout comme un appel de méthode normal.
la source
Tiré de la FAQ sur les threads Java de style de code :
la source
thread's run() method executes the run() method of the Runnable object in the new thread instead.
Ce n'est pas vrai (ou du moins mon code source Java 8 indique le contraire), mais malheureusement, le lien semble rompu, alors je signale l'erreur ici à la place.thread.run()
placethread.start()
.L'exécution
thread.run()
ne crée pas de nouveauThread
dans lequel votre code est exécuté. Il exécute simplement le code dans le Thread actuel à partir duquel lethread.run()
code est appelé.L'exécution
thread.start()
crée un nouveau thread au niveau du système d'exploitation dans lequel larun()
méthode est appelée.En substance:
De plus, comme d'autres l'ont mentionné, «tester» semble être le seul cas recommandé dans lequel vous pouvez invoquer
run()
directement à partir de votre code.la source
Cela a déjà été évoqué, mais juste pour être clair: créer un nouvel objet Thread uniquement pour appeler sa méthode run () est inutilement coûteux et devrait être un drapeau rouge majeur. Ce serait une conception bien meilleure et plus découplée pour créer un impl Runnable et soit (a) appeler sa méthode run () directement si c'est le comportement souhaité, soit (b) construire un nouveau Thread avec ce Runnable et démarrer le Thread.
Mieux encore, pour encore plus de découplage, consultez l'
Executor
interface et le framework dans JDK 5 et plus récent. Cela vous permet, en un mot, de découpler l'exécution de la tâche (l'instance Runnable) de la façon dont elle est exécutée (l'implémentation Executor, qui peut exécuter le Runnable dans le Thread actuel, dans un nouveau Thread, en utilisant un Thread existant d'un pool, et ainsi de suite).la source
Appelez
thread.start()
, il appellera à son tourthread.run()
. Je ne peux pas penser à un cas où vous voudriez contournerthread.start()
et aller directement àthread.run()
la source
Les méthodes distinctes
start()
etrun()
de la classe Thread fournissent deux méthodes pour créer des programmes threadés. Lastart()
méthode démarre l'exécution du nouveau thread et appelle larun()
méthode. Lastart()
méthode retourne immédiatement et le nouveau thread continue normalement jusqu'à ce que larun()
méthode retourne.La
run()
méthode de la classe Thread ne fait rien, donc les sous-classes doivent remplacer la méthode avec du code à exécuter dans le deuxième thread. Si un thread est instancié avec un argument Runnable, larun()
méthode du thread exécute larun()
méthode de l'objet Runnable dans le nouveau thread à la place.Selon la nature de votre programme threadé, l'appel
run()
direct de la méthode Thread peut donner le même résultat que l'appel via lastart()
méthode, mais dans ce dernier cas, le code est en fait exécuté dans un nouveau thread.référence
la source
The start() method returns immediately and the new thread normally continues until the run() method returns.
Sistart()
revient immédiatement, comment se fait-il que lerun()
continue de fonctionner étant donné qu'il a été appelé lui-même à partir destart()
Si la question était - "pourquoi la méthode de démarrage de thread est appelée au lieu de la méthode d'exécution directement" alors j'ai répondu avec un exemple de code ci-dessous. J'espère que cela clarifie. Dans l'exemple ci-dessous:
la source
Lorsque vous souhaitez qu'il s'exécute de manière synchrone. L'appel de la méthode run ne vous donnera pas réellement de multi-threading. La méthode start crée un nouveau thread qui appelle la méthode run.
la source
Si vous voulez exécuter le contenu de run () comme vous le feriez pour toute autre méthode. Pas pour démarrer un fil, bien sûr.
la source
En supposant que vous connaissez l'utilisation de la méthode de démarrage et d'exécution, c.-à-d. Synchrone ou asynchrone; La méthode run peut être utilisée uniquement pour tester la fonctionnalité.
De plus, dans certaines circonstances, la même classe de thread peut être utilisée à deux endroits différents avec des exigences de fonctionnalité de synchronisation et d'asynchrone en ayant deux objets différents avec une méthode d'exécution et une autre méthode de démarrage appelée.
la source
Au moins dans la JVM 1.6., Il y a un peu de vérification et l'exécution est appelée nativement:
la source
Juste une note aux excellents commentaires ci-dessus: parfois vous écrivez un code multi-thread qui utilise la méthode "start" pour exécuter différents threads. Vous trouverez cela beaucoup plus facile si vous utilisez "run" (au lieu de "start) pour le débogage car cela permet au code de s'exécuter de manière synchrone et de le déboguer beaucoup plus facilement.
la source
la source