Melden Sie sich buchstäblich an. Schauen wir uns die Erklärung und Implementierung der Join -Methode an.
/*** wartet darauf, dass dieser Thread stirbt. * Der Anrufer -Thread (der Thread, der die Join -Methode aufruft) führt einen Wartvorgang aus, bis der aufgerufene Thread (der Thread, zu dem die Join -Methode gehört) endet und erneut aufgeweckt wird. Der unterbrochene Status </i> des aktuellen Threads wird gelöscht, wenn diese Ausnahme ausgelöst wird. */ public Final void join () löscht InterruptedException {join (0) aus; }Hier heißt Join
/** * wartet höchstens {@code millis} millionenkunden, bis dieser Thread * stirbt. Eine Zeitüberschreitung von {@code 0} bedeutet, auf das Ende der Thread -Ausführung zu warten, oder die angegebene maximale Wartezeit ist eingetroffen. Der Thread des Anrufers wird erneut geweckt. Wenn die maximale Wartezeit 0 beträgt, können Sie nur darauf warten, dass die Thread -Ausführung endet, bevor Sie aufwachen können. * <P> Diese Implementierung verwendet eine Schleife von {@code this.wait} Aufrufe * Konditioniert auf {@code this.isalive}. Als Thread endet die * {@code this.notifyall} -Methode, die aufgerufen wird. Es wird empfohlen, dass * Anwendungen {@Code Wait}, {@Code Notify} oder * {@Code Notifyall} auf {@Code -Thread} nicht verwenden. * * */ public Final Synchronized void Join (Long Millis) löscht InterruptedException {long base = system.currentTimemillis (); lang jetzt = 0; if (millis <0) {werfen neuer illegalArgumentException ("Timeout -Wert ist negativ"); } if (millis == 0) {while (iSalive ()) {wait (0); }} else {while (iSalive ()) {long Delay = Millis - jetzt; if (delay <= 0) {break; } warte (Verzögerung); jetzt = System.currentTimemillis () - Basis; }}} Es ist ersichtlich, dass die Join -Methode selbst das Warten durch die Wartenmethode implementiert. Hier wird beurteilt, dass, wenn der Thread noch läuft, weiter warten. Wenn die angegebene Zeit gekommen ist oder der Thread ausgeführt wurde, wird der Code weiter nach unten ausgeführt und der aufrufende Thread kann die nachfolgende Logik ausführen.
Aber hier sehe ich nicht, wo ich die Benachrichtigung oder Benachrichtigung aufrufen soll. Wenn es nicht aufgerufen wird, wartet der Anrufer -Thread weiter. Wo hat die Methode, um sie aufzuwecken? Durch die Überprüfung wurde festgestellt, dass die virtuelle Java -Maschine, als der Thread endete, die lokale Exit -Methode des Threads ausgeführt hat.
//Thread exit function: void JavaThread::exit(bool destroy_vm, ExitType exit_type) {...//This will handle the join-related destruction logic ensure_join(this);...}//Process the join-related destruction logic static void ensure_join(JavaThread* thread) { Handle threadObj(thread, thread->threadObj()); ObjectLocker Lock (ThreadObj, Thread); Thread-> clear_pending_exception (); java_lang_thread :: set_thread_status (threadObj (), java_lang_thread :: beendet); java_lang_thread :: set_thread (threadObj (), null); // Hier rufen wir die Notifyall -Methode auf, um die Wartedhread -Sperre aufzuwecken. Notify_all (Thread); Thread-> clear_pending_exception (); }Dies wird verstehen, wenn der Thread geweckt wird. Schreiben wir unten ein Beispiel, um den Effekt anzuzeigen.
öffentliche Klasse Jointest {public static void main (String [] args) {threadboy boy = new threadboy (); boy.start (); } statischer Klasse Threadboy erweitert Thread {@Override public void run () {System.out.println ("Junge und Mädchen sind bereit zum Einkaufen"); ThreadGirl Girl = neuer ThreadGirl (); Mädchen.Start (); versuche {girl.join (); } catch (interruptedException e) {e.printstacktrace (); } System.out.println ("Der Junge und das Mädchen beginnen einzukaufen"); }} statischer Klasse ThreadGirl erweitert Thread {@Override public void run () {int time = 5000; System.out.println ("Das Mädchen beginnt Make -up, der Junge wartet ..."); versuche {thread.sleep (Zeit); } catch (interruptedException e) {e.printstacktrace (); } System.out.println ("Das Mädchen ist mit Make -up!, Zeit genommen" + Zeit); }}}} Das Ausführungsergebnis ist:
Der Junge und das Mädchen gehen einkaufen und das Mädchen beginnt Make -up, der Junge wartet. . .
Das Make -up des Mädchens ist fertig! , 5000
Der Junge und das Mädchen fingen an zu kaufen
Der Junge und das Mädchen werden einkaufen gehen. Das Mädchen muss zuerst Make -up aufnehmen. Nachdem das Mädchen Make -up beendet hat, wird sie zusammen einkaufen gehen.
Was ist die Verwendung von Join (Zeit)?
öffentliche Klasse Jointest {public static void main (String [] args) {threadboy boy = new threadboy (); boy.start (); } statischer Klasse Threadboy erweitert Thread {@Override public void run () {System.out.println ("Junge und Mädchen sind bereit zum Einkaufen"); ThreadGirl Girl = neuer ThreadGirl (); Mädchen.Start (); int time = 2000; versuche {girl.join (Zeit); } catch (interruptedException e) {e.printstacktrace (); } System.out.println ("Der Junge wartete" + Zeit + ", ich möchte nicht länger warten, ich gehe einkaufen"); }} statischer Klasse ThreadGirl erweitert Thread {@Override public void run () {int time = 5000; System.out.println ("Das Mädchen begann Make -up, der Junge wartete ..."); versuche {thread.sleep (Zeit); } catch (interruptedException e) {e.printstacktrace (); } System.out.println ("Das Mädchen hat fertig gemacht!, Zeit genommen" + Zeit); }}} Hier wird die Join -Methode nur durch die Join (Time) -Methode ersetzt. Die Beschreibung wurde geändert und das Druckergebnis ist:
Der Junge und das Mädchen gehen einkaufen und das Mädchen beginnt Make -up, der Junge wartet. . .
Der Junge wartete 2.000 und wollte nicht länger warten. Er ging einkaufen und das Mädchen hat fertig gemacht! , 5000
Der Junge wartete auf die Zeit in Join (Zeit). Wenn der Thread, in dem das Mädchen war, nach dieser Zeit nicht hingerichtet wurde, wird er nicht länger warten und die nachfolgende Logik weiter ausführen, nur um alleine einkaufen zu gehen, ohne auf das Mädchen zu warten.
Daraus können wir erkennen, dass die Join -Methode darin besteht, die synchrone Ausführung von zwei Threads bequemer zu erreichen. Thread 1 führt aus. Warten Sie nach der Ausführung von Thread 2, nachdem Sie Thread 2 ausführen können, und führen Sie dann weiter aus. Die Bedeutung des Beitritts ist jetzt visueller.
Das obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, es wird für das Lernen aller hilfreich sein und ich hoffe, jeder wird Wulin.com mehr unterstützen.