Dans ce code, que signifient les deux jointures et cassures? t1.join()
provoque l' t2
arrêt jusqu'à la t1
fin?
Thread t1 = new Thread(new EventThread("e1"));
t1.start();
Thread t2 = new Thread(new EventThread("e2"));
t2.start();
while (true) {
try {
t1.join();
t2.join();
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
java
multithreading
user697911
la source
la source
while(true)
d'appeler lajoin
méthode.Réponses:
Pour citer la
Thread.join()
méthode javadocs :Il y a un thread qui exécute votre exemple de code qui est probablement le thread principal .
t1
ett2
. Les deux threads commencent à s'exécuter en parallèle.t1.join()
à attendre que let1
thread se termine.t1
thread se termine et lat1.join()
méthode retourne dans le thread principal. Notez que celat1
aurait déjà pu se terminer avant que l'join()
appel ne soit effectué, auquel cas l'join()
appel reviendra immédiatement.t2.join()
à attendre que let2
thread se termine.t2
thread se termine (ou il s'est peut-être terminé avant let1
thread) et lat2.join()
méthode retourne dans le thread principal.Il est important de comprendre que les threads
t1
ett2
ont été exécutés en parallèle, mais que le thread principal qui les a démarrés doit attendre qu'ils se terminent avant de pouvoir continuer. C'est un schéma courant. Aussi,t1
et / out2
aurait pu se terminer avant que le thread principal ne les appellejoin()
. Si c'est le cas,join()
n'attendra pas mais reviendra immédiatement.Non. Le thread principal qui appelle
t1.join()
s'arrêtera de s'exécuter et attendra lat1
fin du thread. Let2
thread s'exécute en parallèle et n'est pas du tout affecté part1
l't1.join()
appel.En termes de try / catch, les
join()
lancersInterruptedException
signifient que le thread principal qui appellejoin()
peut lui-même être interrompu par un autre thread.Avoir les jointures en
while
boucle est un schéma étrange. En règle générale, vous effectuez la première jointure, puis la deuxième jointure en gérantInterruptedException
correctement dans chaque cas. Pas besoin de les mettre en boucle.la source
t1
ett2
peut fonctionner en parallèle. C'est juste quemain
les deux ont besoin de finir avant que cela puisse continuer. C'est un modèle typique @ user697911.while
boucle est-elle là parce que (je suppose) qu'elle veut réessayer lesjoin()
appels si l'un est interrompu? Je ne l'écrirais certainement pas de cette façon @ user697911.t1
ett2
finir. C'est à dire. sit1
jette leInterruptedException
, il bouclera et attendrat2
. Une alternative consiste à attendre les deux threads dans chacun de leur Try-Catch, afin d'éviter la boucle. De plus, en fonction deEventThread
cela, il peut être judicieux de le faire de cette façon, car nous exécutons 2 threads, pas un.C'est une question d' entrevue Java préférée .
t1.join()
signifie, t1 dit quelque chose comme " Je veux terminer en premier ". Il en va de même avect2
. Peu importe qui a démarrét1
out2
thread (dans ce cas, lamain
méthode), main attendrat1
ett2
finira sa tâche.Cependant, un point important à noter,
t1
ett2
eux - mêmes peuvent s'exécuter en parallèle indépendamment de la séquence d'appel de jointure surt1
ett2
. C'est lemain/daemon
fil qui doit attendre .la source
t1.join(); t2.join();
ne permettra pas au thread qui exécute les jointures de continuer tant que les deux threads ne sont pas terminés. En l'absence de code très inhabituel ailleurs, l'ordre des jointures n'a pas d'importance.join()
signifie attendre qu'un thread se termine. Ceci est une méthode de blocage. Votre thread principal (celui qui fait lejoin()
) attendra sur lat1.join()
ligne jusqu'à ce qu'ilt1
termine son travail, puis fera de même pourt2.join()
.la source
Une image vaut mieux que mille mots.
J'espère utile, pour plus de détails cliquez ici
la source
Lorsque le thread tA appelle tB.join (), il n'attend pas seulement que tB meure ou tA s'interrompe lui-même, mais crée une relation entre la dernière instruction de tB et l'instruction suivante après tB.join () dans le thread tA.
Cela signifie programme
Toujours imprimer
Mais programme
Peut imprimer non seulement
Mais
Toujours seulement «0».
Parce que Java Memory Model ne nécessite pas de `` transfert '' de la nouvelle valeur de `` sharedVar '' de threadB vers le thread principal sans relation heppens-before (démarrage de thread, jointure de thread, utilisation du mot-clé `` synchonized '', utilisation des variables AtomicXXX, etc.).
la source
En termes simples:
t1.join()
retourne une foist1
terminé.Il ne fait rien pour le filetage
t1
, sauf attendre la fin.Naturellement, le code suivant
t1.join()
ne sera exécuté qu'après lest1.join()
retours.la source
Depuis la page de documentation d'Oracle sur les jointures
Si t1 est un
Thread
objet dont le thread est en cours d'exécution,Si t2 est un
Thread
objet dont le thread est en cours d'exécution,join
L'API est une API de bas niveau, qui a été introduite dans les versions antérieures de java. Beaucoup de choses ont été modifiées au fil du temps (en particulier avec la version jdk 1.5) sur le front de la concurrence.Vous pouvez réaliser la même chose avec l'API java.util.concurrent. Certains des exemples sont
ExecutorService
Executors
(depuis java 8)Reportez-vous aux questions SE connexes:
attendez que tous les threads aient terminé leur travail en java
la source
Pour moi, le comportement de Join () était toujours déroutant car j'essayais de me rappeler qui attendra qui. N'essayez pas de vous en souvenir de cette façon.
Nous savons tous que, lorsque nous appelons wait () sur n'importe quel objet (t1), l'objet appelant (main) est envoyé dans la salle d'attente (état bloqué).
Ici, le thread principal appelle join () qui est wait () sous les couvertures. Ainsi, le thread principal attendra d'être notifié. La notification est donnée par t1 à la fin de son exécution (achèvement du thread).
Après avoir reçu la notification, main sort de la salle d'attente et procède à son exécution.
la source
J'espère que ça aide!
la source
disons que notre thread principal démarre les threads t1 et t2. Maintenant, quand t1.join () est appelé, le thread principal se suspend jusqu'à ce que le thread t1 meurt, puis se reprend. De même, lorsque t2.join () s'exécute, le thread principal se suspend à nouveau jusqu'à ce que le thread t2 meure, puis reprend.
Alors, voici comment cela fonctionne.
De plus, la boucle while n'était pas vraiment nécessaire ici.
la source