En este código, ¿qué significan las dos uniones y la ruptura? t1.join()hace t2que pare hasta que t1termina?
Thread t1 = new Thread(new EventThread("e1"));
t1.start();
Thread t2 = new Thread(new EventThread("e2"));
t2.start();
while (true) {
try {
t1.join();
t2.join();
break;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
java
multithreading
usuario697911
fuente
fuente

while(true)llamar aljoinmétodo.Respuestas:
Para citar del
Thread.join()método javadocs :Hay un hilo que ejecuta su código de ejemplo, que probablemente sea el hilo principal .
t1yt2. Los dos hilos comienzan a ejecutarse en paralelo.t1.join()a esperar que elt1hilo termine.t1hilo se completa y elt1.join()método regresa en el hilo principal. Tenga en cuenta quet1ya podría haber finalizado antes de realizar lajoin()llamada, en cuyo caso lajoin()llamada volverá de inmediato.t2.join()a esperar que elt2hilo termine.t2hilo se completa (o podría haberse completado antes que elt1hilo) y elt2.join()método regresa en el hilo principal.Es importante comprender que los subprocesos
t1y set2han estado ejecutando en paralelo, pero el subproceso principal que los inició debe esperar a que finalicen antes de que pueda continuar. Ese es un patrón común. Además,t1y / ot2podría haber terminado antes de que el hilo principal los llamejoin(). Si es asíjoin(), no esperará pero volverá de inmediato.No. El hilo principal que llama
t1.join()dejará de funcionar y esperarát1a que termine el hilo. Elt2hilo se ejecuta en paralelo y no se ve afectado port1lat1.join()llamada ni en absoluto.En términos de try / catch, los
join()lanzamientosInterruptedExceptionsignifican que el hilo principal que está llamandojoin()puede ser interrumpido por otro hilo.Tener las uniones en un
whilebucle es un patrón extraño. Por lo general, haría la primera combinación y luego la segunda combinación manejandoInterruptedExceptionadecuadamente en cada caso. No es necesario ponerlos en un bucle.fuente
t1yt2pueden ejecutarse en paralelo. Es solo quemainnecesita que ambos terminen antes de que pueda continuar. Ese es un patrón típico @ user697911.whilebucle está allí porque (supongo) que quiere volver a intentar lasjoin()llamadas si se interrumpe una? Ciertamente no lo escribiría de esa manera @ user697911.t1yt2terminar. Es decir. sit1arroja elInterruptedException, retrocederá y esperarát2. Una alternativa es esperar ambos hilos en cada uno de sus Try-Catch, para evitar el bucle. Además, dependiendo deEventThread, puede tener sentido hacerlo de esta manera, ya que estamos ejecutando 2 hilos, no uno.Esta es una pregunta favorita de la entrevista Java .
t1.join()significa que t1 dice algo así como " Quiero terminar primero ". Igual es el caso cont2. No importa quién iniciót1ot2subproceso (en este caso, elmainmétodo), main esperará hastat1yt2finalizará su tarea.Sin embargo, un punto importante a tener en cuenta,
t1yt2ellos mismos pueden ejecutarse en paralelo, independientemente de la secuencia de llamada de combinación ent1yt2. Es elmain/daemonhilo que tiene que esperar .fuente
t1.join(); t2.join();no permitirá que el hilo que ejecuta las uniones continúe hasta que ambos hilos hayan terminado. En ausencia de un código muy inusual en otra parte, el orden de las uniones no importa.join()significa esperar a que se complete un hilo. Este es un método de bloqueo. Su hilo principal (el que hace eljoin()) esperará en lat1.join()línea hasta quet1termine su trabajo, y luego hará lo mismot2.join().fuente
Una imagen vale mas que mil palabras.
Espero sea útil, para más detalles haga clic aquí
fuente
Cuando el hilo tA llama a tB.join (), sus causas no solo esperan a que tB muera o tA se interrumpa, sino que crea una relación de suceso anterior entre la última declaración en tB y la siguiente declaración después de tB.join () en el hilo tA.
Significa programa
Siempre imprimir
Pero programa
Puede imprimir no solo
Pero
Siempre solo '0'.
Debido a que Java Memory Model no requiere 'transferir' un nuevo valor de 'sharedVar' de threadB a thread principal sin una relación heppens-before (inicio de hilo, unión de hilo, uso de palabra clave 'sincronizada', uso de variables AtomicXXX, etc.).
fuente
En pocas palabras:
t1.join()regresa después de quet1se complete.No hace nada para enhebrar
t1, excepto esperar a que termine.Naturalmente, el siguiente código
t1.join()se ejecutará solo después de last1.join()devoluciones.fuente
Desde la página de documentación de Oracle en Uniones
Si t1 es un
Threadobjeto cuyo hilo se está ejecutando actualmente,Si t2 es un
Threadobjeto cuyo hilo se está ejecutando actualmente,joinAPI es API de bajo nivel, que se ha introducido en versiones anteriores de java. Muchas cosas han cambiado durante un período de tiempo (especialmente con la versión jdk 1.5) en el frente de concurrencia.Puede lograr lo mismo con la API java.util.concurrent. Algunos de los ejemplos son
ExecutorServiceExecutors(desde java 8)Consulte las preguntas relacionadas de SE:
esperar hasta que todos los hilos terminen su trabajo en java
fuente
Para mí, el comportamiento de Join () siempre fue confuso porque estaba tratando de recordar quién esperará a quién. No trates de recordarlo de esa manera.
Todos sabemos que, cuando llamamos a wait () en cualquier objeto (t1), el objeto que llama (main) se envía a la sala de espera (estado bloqueado).
Aquí, el hilo principal está llamando a join (), que es wait () debajo de las cubiertas. Entonces el hilo principal esperará hasta que sea notificado. La notificación es dada por t1 cuando termina su ejecución (finalización de subproceso).
Después de recibir la notificación, main sale de la sala de espera y procede a su ejecución.
fuente
¡Espero eso ayude!
fuente
Digamos que nuestro hilo principal comienza los hilos t1 y t2. Ahora, cuando se llama a t1.join (), el hilo principal se suspende hasta que el hilo t1 muere y luego se reanuda. De manera similar, cuando se ejecuta t2.join (), el hilo principal se suspende nuevamente hasta que el hilo t2 muere y luego se reanuda.
Entonces, así es como funciona.
Además, el ciclo while no era realmente necesario aquí.
fuente