Was bedeuten in diesem Code die beiden Verknüpfungen und Unterbrechungen? t1.join()
Ursachen t2
zu stoppen, bis t1
beendet?
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
quelle
quelle
while(true)
diejoin
Methode nicht aufrufen .Antworten:
Um aus der
Thread.join()
Methode javadocs zu zitieren :Es gibt einen Thread, in dem Ihr Beispielcode ausgeführt wird, der wahrscheinlich der Hauptthread ist .
t1
undt2
-Threads. Die beiden Threads laufen parallel.t1.join()
auf, um zu warten, bis dert1
Thread beendet ist.t1
Thread wird abgeschlossen und diet1.join()
Methode wird im Hauptthread zurückgegeben. Beachten Sie, dasst1
dies möglicherweise bereits vor demjoin()
Tätigen des Anrufs beendet wurde. In diesem Fall wird derjoin()
Anruf sofort zurückgegeben.t2.join()
auf, um zu warten, bis dert2
Thread beendet ist.t2
Thread wird abgeschlossen (oder möglicherweise vor demt1
Thread abgeschlossen) und diet2.join()
Methode wird im Hauptthread zurückgegeben.Es ist wichtig zu verstehen, dass die
t1
undt2
-Threads parallel ausgeführt wurden, aber der Hauptthread, der sie gestartet hat, muss warten, bis sie beendet sind, bevor sie fortgesetzt werden können. Das ist ein gängiges Muster. Aucht1
und / odert2
hätte beendet werden können, bevor der Haupt-Thread sie aufruftjoin()
. Wenn ja, dannjoin()
wird nicht warten, sondern sofort zurückkehren.Nein. Der aufrufende Haupt- Thread
t1.join()
wird nicht mehr ausgeführt und wartet, bis dert1
Thread beendet ist. Dert2
Thread läuft parallel und ist vont1
oder demt1.join()
Aufruf überhaupt nicht betroffen .Im Hinblick auf die try / catch, das
join()
wirftInterruptedException
was bedeutet , dass der Haupt - Thread, der ruftjoin()
kann selbst von einem anderen Thread unterbrochen werden.Die Verknüpfungen in einer
while
Schleife zu haben, ist ein seltsames Muster. Normalerweise führen Sie den ersten Join und dann den zweiten Join durch, um die jeweilsInterruptedException
entsprechenden Verknüpfungen durchzuführen . Sie müssen sie nicht in eine Schleife setzen.quelle
t1
undt2
parallel laufen kann. Es ist nur so, dassmain
beide fertig sein müssen, bevor es weitergehen kann. Das ist ein typisches Muster @ user697911.while
Schleife ist da, weil sie (glaube ich) diejoin()
Anrufe wiederholen möchte, wenn einer unterbrochen wird? Ich würde es auf keinen Fall so schreiben @ user697911.t1
undt2
beenden. Dh. Wenn dast1
geworfen wirdInterruptedException
, wird es zurückgeschleift und wartet auft2
. Eine Alternative besteht darin, in ihrem Try-Catch auf beide Threads zu warten, damit die Schleife vermieden werden kann. AbhängigEventThread
davon kann es auch sinnvoll sein, dies auf diese Weise zu tun, da wir zwei Threads ausführen, nicht einen.Dies ist eine beliebte Java-Interviewfrage .
t1.join()
bedeutet, t1 sagt so etwas wie " Ich möchte zuerst fertig werden ". Gleiches gilt fürt2
. Unabhängig davon, wer gestartett1
odert2
Thread (in diesem Fall diemain
Methode), wartet main bist1
undt2
beendet seine Aufgabe.Ein wichtiger Punkt jedoch zu notieren,
t1
undt2
selbst kann parallel unabhängig von der Join - Aufrufsequenz läuft auft1
undt2
. Es ist dermain/daemon
Thread, der warten muss .quelle
t1.join(); t2.join();
Der Thread, der die Joins ausführt, kann erst fortgesetzt werden, wenn beide Threads beendet wurden. Da an anderer Stelle kein sehr ungewöhnlicher Code vorhanden ist, spielt die Reihenfolge der Verknüpfungen keine Rolle.join()
bedeutet, auf den Abschluss eines Threads zu warten. Dies ist eine Blockermethode. Ihr Haupt-Thread (derjenige, der das machtjoin()
) wartet in dert1.join()
Leitung, bist1
seine Arbeit beendet ist, und macht dann dasselbe fürt2.join()
.quelle
Ein Bild sagt mehr als tausend Worte.
Ich hoffe, nützlich, für weitere Details klicken Sie hier
quelle
Wenn der Thread tA tB.join () aufruft, wartet er nicht nur darauf, dass tB stirbt oder tA selbst unterbrochen wird, sondern erstellt eine Beziehung zwischen der letzten Anweisung in tB und der nächsten Anweisung nach tB.join () im tA-Thread.
Es bedeutet Programm
Immer drucken
Aber programmieren
Kann nicht nur drucken
Aber
Immer nur '0'.
Da für das Java-Speichermodell kein "Übertragen" des neuen Werts von "sharedVar" von threadB zum Hauptthread ohne Heppens-before-Beziehung erforderlich ist (Thread-Start, Thread-Verknüpfung, Verwendung des Schlüsselworts "synchronisiert", Verwendung von AtomicXXX-Variablen usw.).
quelle
Einfach ausgedrückt:
t1.join()
kehrt nacht1
Abschluss zurück.Es macht nichts zum Threading
t1
, außer warten, bis es fertig ist.Natürlich wird der folgende Code
t1.join()
erst nach dert1.join()
Rückgabe ausgeführt.quelle
Von der Oracle-Dokumentationsseite auf Joins
Wenn t1 ein
Thread
Objekt ist, dessen Thread gerade ausgeführt wird,Wenn t2 ein
Thread
Objekt ist, dessen Thread gerade ausgeführt wird,join
API ist eine Low-Level-API, die in früheren Versionen von Java eingeführt wurde. Viele Dinge wurden im Laufe der Zeit (insbesondere mit jdk 1.5 Release) in Bezug auf die Parallelität geändert.Sie können dasselbe mit der API java.util.concurrent erreichen. Einige Beispiele sind
ExecutorService
Executors
(seit Java 8)Siehe verwandte SE-Fragen:
Warten Sie, bis alle Threads ihre Arbeit in Java beendet haben
quelle
Für mich war das Verhalten von Join () immer verwirrend, weil ich mich daran erinnern wollte, wer auf wen warten wird. Versuchen Sie nicht, sich so daran zu erinnern.
Wir alle wissen, dass, wenn wir wait () für ein Objekt (t1) aufrufen, das aufrufende Objekt (main) an den Warteraum gesendet wird (blockierter Zustand).
Hier ruft der Hauptthread join () auf, das unter dem Deckmantel wait () ist. Der Haupt-Thread wartet also, bis er benachrichtigt wird. Die Benachrichtigung erfolgt durch t1, wenn der Lauf beendet ist (Thread-Abschluss).
Nach Erhalt der Benachrichtigung verlässt main den Warteraum und setzt die Ausführung fort.
quelle
Ich hoffe es hilft!
quelle
Nehmen wir an, unser Haupt-Thread startet die Threads t1 und t2. Wenn nun t1.join () aufgerufen wird, hält sich der Haupt-Thread an, bis der Thread t1 stirbt, und setzt sich dann fort. In ähnlicher Weise wird der Hauptthread beim Ausführen von t2.join () erneut angehalten, bis der Thread t2 stirbt und dann fortgesetzt wird.
So funktioniert es also.
Auch die while-Schleife wurde hier nicht wirklich benötigt.
quelle