Was bedeutet dieser Thread-Join-Code?
Um aus der Thread.join()Methode javadocs zu zitieren :
join() Wartet darauf, dass dieser Thread stirbt.
Es gibt einen Thread, in dem Ihr Beispielcode ausgeführt wird, der wahrscheinlich der Hauptthread ist .
- Der Haupt-Thread erstellt und startet die
t1und t2-Threads. Die beiden Threads laufen parallel.
- Der Haupt-Thread ruft
t1.join()auf, um zu warten, bis der t1Thread beendet ist.
- Der
t1Thread wird abgeschlossen und die t1.join()Methode wird im Hauptthread zurückgegeben. Beachten Sie, dass t1dies möglicherweise bereits vor dem join()Tätigen des Anrufs beendet wurde. In diesem Fall wird der join()Anruf sofort zurückgegeben.
- Der Haupt-Thread ruft
t2.join()auf, um zu warten, bis der t2Thread beendet ist.
- Der
t2Thread wird abgeschlossen (oder möglicherweise vor dem t1Thread abgeschlossen) und die t2.join()Methode wird im Hauptthread zurückgegeben.
Es ist wichtig zu verstehen, dass die t1und t2-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. Auch t1und / oder t2hätte beendet werden können, bevor der Haupt-Thread sie aufruft join(). Wenn ja, dann join()wird nicht warten, sondern sofort zurückkehren.
t1.join() bedeutet, dass t2 stoppt, bis t1 endet?
Nein. Der aufrufende Haupt- Thread t1.join()wird nicht mehr ausgeführt und wartet, bis der t1Thread beendet ist. Der t2Thread läuft parallel und ist von t1oder dem t1.join()Aufruf überhaupt nicht betroffen .
Im Hinblick auf die try / catch, das join()wirft InterruptedExceptionwas bedeutet , dass der Haupt - Thread, der ruft join()kann selbst von einem anderen Thread unterbrochen werden.
while (true) {
Die Verknüpfungen in einer whileSchleife zu haben, ist ein seltsames Muster. Normalerweise führen Sie den ersten Join und dann den zweiten Join durch, um die jeweils InterruptedExceptionentsprechenden Verknüpfungen durchzuführen . Sie müssen sie nicht in eine Schleife setzen.