Uso del método de unión en la programación concurrente de Java

Introducción

En la programación de subprocesos múltiples, a veces la ejecución de un subproceso puede depender del resultado de ejecución de otro subproceso. JDK proporciona el método de unión para lograr esta función.

Cuando llamamos al método de unión en el hilo, el hilo que llama entra en estado de espera. Permanece en estado de espera hasta que se completa la ejecución del subproceso al que se hace referencia.

join y su método de sobrecarga:

  1. join () , espere el final de la ejecución del hilo.
  2. join (long millis) , similar al método join (), con un parámetro adicional de milisegundos, que indica el número máximo de milisegundos de espera para que se ejecute el hilo. join (0) es equivalente a join ().
  3. join (long millis, int nanos) es el mismo que el método join (long millis), excepto que el tiempo de espera tiene mayor precisión.

Uso básico del método de unión

Esperando el final del subproceso secundario, el subproceso principal continuará la ejecución:

// java 项目 www.fhadmin.org 
public class Demo { 
    public static void main (String [] args) throws InterruptedException { 
        Thread thread = new Thread (() -> { 
            try { 
                Thread.sleep (3000); 
            } catch (InterruptedException e) { 
                e.printStackTrace (); 
            } 

            System.out.println ("数据 加载 中 ..."); 
        }); 

        thread.start (); 
        thread.join (); 

        System.out.println ("数据 加载 完毕"); 
    } 
}

Resultado de salida:

Carga de datos ... 
Carga de datos completada

Establezca el tiempo de espera máximo, después de este tiempo, el hilo principal continuará ejecutándose, en lugar de esperar a que se ejecute el final del hilo secundario:

// java 项目 www.fhadmin.org 
public class Demo { 
    public static void main (String [] args) throws InterruptedException { 
        Thread thread = new Thread (() -> { 
            try { 
                Thread.sleep (3000); 
            } catch (InterruptedException e) { 
                e.printStackTrace (); 
            } 

            System.out.println ("数据 加载 中 ..."); 
        }); 

        thread.start (); 
        thread.join (1000); 

        System.out.println ("数据 加载 完毕"); 
    } 
}

Resultado de salida:

Se completó la 
carga de datos Cargando datos ...


Código fuente del método de unión

El código fuente del método de unión es el siguiente:

// proyecto java www.fhadmin.org 
public final sincronizada void join (long millis) throws InterruptedException { 
	long base = System.currentTimeMillis (); 
	long now = 0; 

	// Si el tiempo de espera es menor que 0, lanza IllegalArgumentException directamente 
	si (millis <0) { 
		throw new IllegalArgumentException ("el valor de tiempo de espera es negativo"); 
	} 

	// El tiempo de espera es 0, llama a wait (0) y espera a que termine el hilo. (join (0) es igual a llamar a wait (0) es igual a llamar a wait ()) 
	if (millis == 0) { 
		while (isAlive ()) { 
			wait (0); 
		} 
	} else { 
		// Cuando la espera el tiempo es mayor que 0, incluso si se despierta a mitad de camino, siempre que no se exceda el tiempo de espera, aún entrará en el estado de espera. 
		while (isAlive ()) { 
			retardo largo = milis-ahora; 
			if (retardo <= 0) { 
				descanso; 
			} 
			esperar (retardo);
			ahora = System.currentTimeMillis () - base; 
		} 
	} 
}

Se puede ver en el código fuente del método de unión que la esencia del método de unión es llamar al método de espera del objeto de hilo. Cuando se llama al método de unión, se debe adquirir el bloqueo del objeto de hilo y luego Se llama al método de espera del objeto hilo. Una vez que finaliza el hilo, el objeto hilo se llama automáticamente al método notifyAll.

Entonces, cuando estamos sincronizando, debemos evitar usar el objeto Thread como el objeto de bloqueo, porque esto puede afectar el trabajo de la API del sistema.


Supongo que te gusta

Origin blog.51cto.com/14622073/2657019
Recomendado
Clasificación