Der in diesem Kapitel verbundene Inhalt umfasst:
1. Join () Einführung
2. Join () Quellcodeanalyse (basierend auf JDK1.7.0_40)
3. join () Beispiel
1. Join () Einführung
Join () ist in Thread.java definiert.
Die Rolle von Join (): Lassen Sie den "Haupt -Thread" warten, bis der "Kinderfaden" endet, bevor er weiter läuft. Dieser Satz mag ein bisschen dunkel sein, aber wir sollten ihn anhand von Beispielen verstehen:
Die Codekopie lautet wie folgt:
// Hauptfaden
Der Vater der öffentlichen Klasse erweitert Thread {
public void run () {
Sohn S = neuer Sohn ();
s.start ();
S.Join ();
...
}
}
// Kinderfaden
Der Sohn der öffentlichen Klasse erweitert Thread {
public void run () {
...
}
}
veranschaulichen:
Die oben genannten sind zwei Klassen Vater (Haupt -Thread -Klasse) und Sohn (Unterstarklasse). Weil Sohn im Vater erstellt und begonnen wird, ist Vater die Hauptklasse der Thread und der Sohn der Kinderfadenklasse.
Erstellen Sie im Hauptfaden im Vater einen neuen "Kinderfaden" durch New Son (). Dann starten Sie "Child Thread S" über s.start () und rufen Sie S.Join () an. Nach Anrufen von S.Join () wartet der Haupt -Haupt -Thread, bis der "Kinderfaden" abgeschlossen ist. Dies ist es, was wir "Die Rolle von Join () nennen, ist es, den Haupt -Thread zu warten, bis der untergeordnete Thread endet, bevor er weiter laufen kann"!
2. Join () Quellcodeanalyse (basierend auf JDK1.7.0_40)
Die Codekopie lautet wie folgt:
public final void join () löst InterruptedException {aus {
Join (0);
}
öffentliche endgültige synchronisierte Leere (Long Millis)
wirft InterruptedException {aus {
long base = system.currentTimemillis ();
lang jetzt = 0;
if (Millis <0) {
Neue IllegalArgumentException werfen ("Timeout -Wert ist negativ");
}
if (Millis == 0) {
while (iSalive ()) {
Warten Sie (0);
}
} anders {
while (iSalive ()) {
lange Verzögerung = Millis - jetzt;
if (delay <= 0) {
brechen;
}
Warten Sie (Verzögerung);
jetzt = System.currentTimemillis () - Basis;
}
}
}
veranschaulichen:
Aus dem Code können wir ihn finden. Wenn Millis == 0 die while (iSalive ()) Schleife betritt;
Wir verstehen die Verwendung von Join () basierend auf dem obigen Code, wenn die Rolle von Join () erklärt wird!
Frage:
Obwohl der Ort, an dem S.Join () aufgerufen wird, im "Vater Hauptfaden" auftritt, wird S. join () durch "Child Thread S" bezeichnet. Dann sollte ISALIVE () in der join () -Methode bestimmen, ob der "Kinderfaden" der lebendige Zustand ist. Wenn dies jedoch der Fall ist, wie könnte die Funktion von S. join () "den Hauptfaden warten lassen, bis der Kinderfaden abgeschlossen ist", sollte es sein, dass der untergeordnete Thread warten lässt (weil die Wartezeit des untergeordneten Threads Objekt S heißt es gut) "?
Antwort: Die Funktion von Wait () besteht darin, den "aktuellen Thread" zu warten, und der "aktuelle Thread" bezieht sich hier auf den Thread, der derzeit auf der CPU ausgeführt wird. Obwohl die Wait () -Methode des untergeordneten Threads aufgerufen wird, wird sie durch den "Hauptfaden" aufgerufen.
3. join () Beispiel
Lassen Sie uns nach dem Verständnis der Rolle von Join () die Verwendung von Join () anhand von Beispielen überprüfen.
Die Codekopie lautet wie folgt:
// Jointest.java Quellcode
öffentliche Klasse Jointest {
public static void main (String [] args) {
versuchen {
Threada T1 = neuer Threada ("T1");
t1.start ();
t1.join ();
System.out.printf ("%s enden/n", thread.currentThread (). GetName ());
} catch (InterruptedException e) {
E. printstacktrace ();
}
}
Statische Klasse Threada erweitert Thread {
public threada (String name) {
Super (Name);
}
public void run () {
System.out.printf ("%s start/n", this.getName ());
// den Betrieb verzögern
für (int i = 0; i <1000000; i ++)
;
System.out.printf ("%s enden/n", this.getName ());
}
}
}
Auslaufergebnisse:
Die Codekopie lautet wie folgt:
T1 Start
T1 Finish
Hauptfinish
Ergebnisse Beschreibung:
Der Betriebsprozess ist in der Abbildung dargestellt
(01) Erstellen Sie ein neues "Thread T1" in "Haupt -Thread Main" über New Threada ("T1"). Starten Sie als nächstes "Thread T1" über t1.start () und führen Sie t1.join () aus.
(02) Nach Ausführung von t1.join () wird der "Haupt -Thread -Haupt" in den "Blockierstatus" gelangen und auf das Ende des T1 -Laufs warten. Nach Abschluss des "Child Thread T1" wird das "Haupt -Thread -Haupt" geweckt, und der "Haupt -Thread" wird die CPU -Ausführungsrechte zurückerhalten und weiterhin ausgeführt.