Le contenu impliqué dans ce chapitre comprend:
1. JOIN () Introduction
2. JOIN () Analyse du code source (basé sur JDK1.7.0_40)
3. Exemple de jointure ()
1. JOIN () Introduction
join() 定义在Thread.java中。
join() 的作用:让“主线程”等待“子线程”结束之后才能继续运行。 Cette phrase peut être un peu obscure, mais nous devons le comprendre à travers des exemples:
La copie de code est la suivante:
// Fil principal
classe publique Le père étend le fil {
public void run () {
Fils s = nouveau fils ();
S.Start ();
S.Join ();
...
}
}
// Fil d'enfant
Le fils de classe publique étend Thread {
public void run () {
...
}
}
illustrer:
Ce qui précède est deux classes Père (classe de fil principale) et son fils (classe de sous-thread). Parce que le fils est créé et démarré en père, le père est la classe de fil principale et son fils est la classe de fil d'enfants.
Dans le fil principal du Père, créez un nouveau "Child Thread S" via un nouveau fils (). Ensuite, démarrez "Child Thread S" via S.Start () et appelez S.Join (). Après avoir appelé S.Join (), le fil principal du père attendra la fin du "fil des enfants"; C'est ce que nous appelons "le rôle de join () est de faire en sorte que le fil principal attende que le fil d'enfant se termine avant qu'il ne puisse continuer à fonctionner"!
2. JOIN () Analyse du code source (basé sur JDK1.7.0_40)
La copie de code est la suivante:
public final void join () lance InterruptedException {
join (0);
}
Public final synchronisé vide join (long millis)
lance InterruptedException {
Long Base = System.Currenttimemillis ();
long maintenant = 0;
if (millis <0) {
throw new IllegalArgumentException("timeout value is negative");
}
if (millis == 0) {
tandis que (isalive ()) {
attendre (0);
}
} autre {
tandis que (isalive ()) {
Long Delay = Millis - MAINTENANT;
if (retard <= 0) {
casser;
}
attendre (retard);
maintenant = System.CurrentTimeMillis () - base;
}
}
}
illustrer:
À partir du code, nous pouvons le trouver. Lorsque Millis == 0, il entrera dans la boucle while (isalive ());
Nous comprenons l'utilisation de join () basée sur le code ci-dessus lors de l'explication du rôle de join ()!
question:
Bien que l'endroit où S.Join () soit appelé se produit dans le "Father Main Thread", S.Join () est appelé join () via "Child Thread S". Ensuite, Isalive () dans la méthode join () doit déterminer si le "thread de l'enfant" est l'état vivant; Mais si tel est le cas, comment la fonction de s.join () pourrait-elle être "Laissez le fil principal attendre jusqu'à ce que le thread de l'enfant se termine", cela devrait être de laisser le fil d'enfant attendre (car la méthode d'attente du fil de l'enfant Les objets s sont bien appelés) "?
Réponse: La fonction d'attente () est de faire attendre le "thread actuel", et le "thread actuel" fait ici référence au thread en cours d'exécution sur le CPU. Par conséquent, bien que la méthode d'attente () du thread de l'enfant soit appelée, elle est appelée à travers le "fil principal"; par conséquent, le thread principal dort, pas le "fil d'enfant"!
3. Exemple de jointure ()
Après avoir compris le rôle de join (), vérifions l'utilisation de join () à travers des exemples.
La copie de code est la suivante:
// Code source conjoint.java
classe publique conjointe {
public static void main (String [] args) {
essayer {
Threada t1 = new Threada ("T1");
t1.start ();
t1.join ();
System.out.printf ("% s final / n", thread.currentThread (). GetName ());
} catch (InterruptedException e) {
e.printStackTrace ();
}
}
classe statique Threada étend Thread {
public threada (nom de chaîne) {
super (nom);
}
public void run () {
System.out.printf ("% s start / n", this.getName ());
// Blace de retard
pour (int i = 0; i <1000000; i ++)
;
System.out.printf ("% s final / n", this.getName ());
}
}
}
Résultats en cours:
La copie de code est la suivante:
T1 Start
finition T1
finition principale
Description des résultats:
Le processus de fonctionnement est illustré sur la figure
(01) Créez un nouveau "Thread T1" dans "Main Thread Main" via un nouveau threada ("T1"). Ensuite, démarrez "Thread T1" via t1.start () et exécutez t1.join ().
(02) Après avoir exécuté T1.Join (), le "principal thread principal" entrera dans "l'état de blocage" et attendra la fin de la course de T1. Une fois le "Child Thread T1" terminé, le "principal thread principal" sera éveillé et le "thread principal" reprendra les droits d'exécution du processeur et continuera à s'exécuter.