El contenido involucrado en este capítulo incluye:
1. Unión () Introducción
2. Análisis de código fuente unión () (basado en JDK1.7.0_40)
3. Ejemplo de unir ()
1. Unión () Introducción
unir () se define en Thread.java.
El papel de Join (): Deje que el "hilo principal" espere a que termine el "hilo infantil" antes de continuar funcionando. Esta oración puede ser un poco oscura, pero debemos entenderla a través de ejemplos:
La copia del código es la siguiente:
// hilo principal
El padre de clase pública extiende el hilo {
public void run () {
Hijo s = nuevo hijo ();
S.Start ();
S.Join ();
...
}
}
// hilo infantil
El hijo de clase pública extiende el hilo {
public void run () {
...
}
}
ilustrar:
Los anteriores son dos clases Padre (clase principal de hilo) y hijo (clase de rejama). Debido a que el hijo es creado y comenzado en el padre, el padre es la clase de hilo principal y el hijo es la clase de hilo infantil.
En el hilo principal del padre, cree un nuevo "hilo infantil" a través de un nuevo hijo (). Luego comience "Hilo infantil S" a través de S.Start () y llame a S.Join (). Después de llamar a S.Join (), el hilo principal del padre esperará hasta que se complete el "hilo infantil"; ¡Esto es lo que llamamos "El papel de unión () es hacer que el hilo principal espere a que el hilo infantil termine antes de que pueda continuar funcionando"!
2. Análisis de código fuente unión () (basado en JDK1.7.0_40)
La copia del código es la siguiente:
Public Final void Join () lanza interruptedException {
unir (0);
}
Público final sincronizado sincronizado unión (Long Millis)
lanza interruptedException {
Long Base = System.CurrentTimemillis ();
largo ahora = 0;
if (Millis <0) {
tirar nueva ilegalargumentException ("el valor de tiempo de espera es negativo");
}
if (millis == 0) {
while (isalive ()) {
esperar (0);
}
} demás {
while (isalive ()) {
retraso largo = milis - ahora;
if (demora <= 0) {
romper;
}
esperar (retraso);
ahora = System.CurrentTimemillis () - Base;
}
}
}
ilustrar:
Del código, podemos encontrarlo. Cuando Millis == 0, entrará en el bucle while (isalive ());
¡Entendemos el uso de Join () basado en el código anterior al explicar el papel de Join ()!
pregunta:
Aunque el lugar donde se llama S.Join () ocurre en el "Hilo principal del Padre", S.Join () se llama unión () a través de "Hilo infantil". Luego, Isalive () en el método unirse () debe determinar si el "hilo infantil" es el estado vivo; Pero si este es el caso, ¿cómo podría la función de s.Join () "dejar que el hilo principal espere hasta que se complete el hilo infantil", debería ser dejar que el hilo del niño espere (porque el método de espera del hilo infantil objeto S se llama bien) "?
Respuesta: La función de Wait () es hacer que el "hilo actual" espera, y el "hilo actual" aquí se refiere al hilo que actualmente se ejecuta en la CPU. Por lo tanto, aunque se llama el método Wait () del hilo infantil, se llama a través del "hilo principal";
3. Ejemplo de unir ()
Después de comprender el papel de Join (), verifiquemos el uso de unión () a través de ejemplos.
La copia del código es la siguiente:
// Código fuente de Java.
clase pública conjunta {
public static void main (string [] args) {
intentar {
Thinga t1 = new Thread ("T1");
t1.start ();
t1.Join ();
System.out.printf ("%s finalización/n", thread.currentThread (). GetName ());
} capt (interruptedException e) {
E.PrintStackTrace ();
}
}
La clase estática Thread extiende el hilo {
Public Thread (nombre de cadena) {
super (nombre);
}
public void run () {
System.out.printf ("%s inicio/n", this.getName ());
// Operación de retraso
para (int i = 0; i <1000000; i ++)
;
System.out.printf ("%s finalización/n", this.getName ());
}
}
}
Resultados de ejecución:
La copia del código es la siguiente:
T1 Inicio
acabado T1
acabado principal
Descripción de los resultados:
El proceso de operación se muestra en la figura
(01) Cree un nuevo "Hilo T1" en "PRINCIPAL PRINCIPAL" a través de New Thread ("T1"). A continuación, comience "Thread T1" a través de T1.Start () y ejecute T1.Join ().
(02) Después de ejecutar T1.Join (), el "PRINCIPAL PRINCIPAL" ingresará al "Estado de bloqueo" y esperará el final de la ejecución de T1. Después de completar el "hilo infantil T1", se despertará el "hilo principal principal", y el "hilo principal" recuperará los derechos de ejecución de la CPU y continuará ejecutándose.