Unirse literalmente significa unirse. Echemos un vistazo a la explicación e implementación del método de unión.
/*** espera a que este hilo muera. * El hilo de la persona que llama (el hilo que llama al método de unión) realiza una operación de espera hasta que el hilo llamado (el hilo al que pertenece el método de unión) termina y se despierta nuevamente * <p> Una invocación de este método se comporta exactamente de la misma manera * que la invocación * * * @throws interrumpedException * si cualquier hilo ha interrumpido el hilo actual. El estado * <i> interrumpido </i> del hilo actual se borra * cuando se lanza esta excepción. */ public Final void Join () lanza interruptedException {unión (0); }Aquí se llama
/** * espera como máximo {@code Millis} millones de segundos para que este hilo muera *. Un tiempo de espera de {@code 0} significa esperar a que la ejecución del hilo finalice, o ha llegado el tiempo máximo de espera especificado, el hilo de la persona que llama se despierta nuevamente. Si el tiempo de espera máximo es 0, solo puede esperar a que la ejecución del hilo finalice antes de poder despertarse. * <p> Esta implementación usa un bucle de {@code this.wait} llamadas * condicionadas en {@code this.isalive}. Como un hilo termina el método * {@code this.notifyall} se invoca. Se recomienda * aplicaciones que no usen {@code Wait}, {@code notify} o * {@code notifyall} en {@code thread} instancias. * * */ public 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 ()) {espera (0); }} else {while (isalive ()) {Long demora = Millis - ahora; if (demora <= 0) {ruptura; } espera (retraso); ahora = System.CurrentTimemillis () - Base; }}} Se puede ver que el método de unión en sí implementa que esperan a través del método de espera. Se juzga aquí que si el hilo aún se está ejecutando, continúe esperando. Si ha llegado el tiempo especificado, o el hilo se ha completado en ejecución, el código continúa ejecutándose hacia abajo, y el hilo de llamada puede ejecutar la lógica posterior.
Pero aquí no veo a dónde llamar al método notificar o notificar. Si no se llama, el hilo de la persona que llama seguirá esperando. ¿Dónde el método lo despertó? A través de la verificación, se descubrió que cuando terminó el hilo, la máquina virtual Java ejecutó el método de salida local del hilo.
// Función de salida de hilo: void javathread :: exit (bool destruye_vm, exittype exit_type) {... // Esto manejará la lógica de destrucción relacionada con la unión asegurar_join (this); ...} // Process el vide de destrucción relacionado con la destrucción relacionado con la destrucción vide_Join (javathread* thread) {huele hilo (hilo, hilo, hift-> threadjj ();));););););););););););););););););); ObjectLocker Lock (ThreadObj, hilo); Thread-> clear_pending_exception (); java_lang_thread :: set_thread_status (threadobj (), java_lang_thread :: terminado); java_lang_thread :: set_thread (threadobj (), null); // Aquí llamamos al método Notifyall para despertar el bloqueo de subprocesos de espera.notify_all (hilo); Thread-> clear_pending_exception (); }Esto entenderá cuándo se despierta el hilo. Escribamos un ejemplo a continuación para ver el efecto.
Public Class Jointest {public static void main (string [] args) {threadboy boy = new Threadboy (); boy.Start (); } La clase Static Threadboy extiende el hilo {@Override public void run () {System.out.println ("El niño y la niña están listos para ir de compras"); Threadgirl girl = new Threadgirl (); Girl.Start (); prueba {girl.Join (); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("El niño y la niña comienzan a comprar"); }} La clase Static Threadgirl extiende el hilo {@Override public void run () {int Time = 5000; System.out.println ("La niña comienza a maquillarse, el niño está esperando ..."); intente {Thread.sleep (Time); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("La niña está terminada con maquillaje!, Tiempo tomado" + tiempo); }}}} El resultado de la ejecución es:
El niño y la niña salen de compras y la niña comienza a maquillarse, el niño está esperando. . .
¡El maquillaje de la niña está terminado! , 5000
El niño y la niña comenzaron a comprar
El niño y la niña van a ir de compras. La niña necesita maquillarse primero. Después de que la niña haya terminado el maquillaje, ella irá de compras juntos.
Entonces, ¿cuál es el uso de unión (tiempo)?
Public Class Jointest {public static void main (string [] args) {threadboy boy = new Threadboy (); boy.Start (); } La clase Static Threadboy extiende el hilo {@Override public void run () {System.out.println ("El niño y la niña están listos para ir de compras"); Threadgirl girl = new Threadgirl (); Girl.Start (); Time int = 2000; prueba {girl.join (tiempo); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("El niño esperó" + Time + ", no quiero esperar más, voy de compras"); }} La clase Static Threadgirl extiende el hilo {@Override public void run () {int Time = 5000; System.out.println ("La niña comenzó a maquillarse, el niño estaba esperando ..."); intente {Thread.sleep (Time); } catch (InterruptedException e) {E.PrintStackTrace (); } System.out.println ("La chica terminó de inventar!, Tiempo tomado" + tiempo); }}} Aquí, el método de unión solo se reemplaza con el método de unión (tiempo). La descripción ha sido cambiada y el resultado de la impresión es:
El niño y la niña salen de compras y la niña comienza a maquillarse, el niño está esperando. . .
El niño esperó 2,000 y no quería esperar más. ¡Fue de compras y la niña terminó de maquillarse! , 5000
El niño esperó el tiempo en unirse (tiempo). Si el hilo en el que se encontraba la niña no se ha ejecutado después de que haya llegado este tiempo, no esperará más y continuará ejecutando la lógica posterior, solo para ir de compras solo sin esperar a la niña.
A partir de esto, podemos ver que el método de unión es lograr la ejecución síncrona de dos hilos más convenientemente. El hilo 1 se ejecuta. Después de encontrar el hilo 2, espere a que el hilo 2 se ejecute y luego continúe ejecutando la ejecución de Thread 1. El significado de unirse ahora es más visual.
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.