En este código, ¿qué significan las dos uniones y la ruptura? t1.join()
hace t2
que pare hasta que t1
termina?
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 aljoin
mé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 .
t1
yt2
. Los dos hilos comienzan a ejecutarse en paralelo.t1.join()
a esperar que elt1
hilo termine.t1
hilo se completa y elt1.join()
método regresa en el hilo principal. Tenga en cuenta quet1
ya podría haber finalizado antes de realizar lajoin()
llamada, en cuyo caso lajoin()
llamada volverá de inmediato.t2.join()
a esperar que elt2
hilo termine.t2
hilo se completa (o podría haberse completado antes que elt1
hilo) y elt2.join()
método regresa en el hilo principal.Es importante comprender que los subprocesos
t1
y set2
han 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,t1
y / ot2
podrí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át1
a que termine el hilo. Elt2
hilo se ejecuta en paralelo y no se ve afectado port1
lat1.join()
llamada ni en absoluto.En términos de try / catch, los
join()
lanzamientosInterruptedException
significan que el hilo principal que está llamandojoin()
puede ser interrumpido por otro hilo.Tener las uniones en un
while
bucle es un patrón extraño. Por lo general, haría la primera combinación y luego la segunda combinación manejandoInterruptedException
adecuadamente en cada caso. No es necesario ponerlos en un bucle.fuente
t1
yt2
pueden ejecutarse en paralelo. Es solo quemain
necesita que ambos terminen antes de que pueda continuar. Ese es un patrón típico @ user697911.while
bucle está allí porque (supongo) que quiere volver a intentar lasjoin()
llamadas si se interrumpe una? Ciertamente no lo escribiría de esa manera @ user697911.t1
yt2
terminar. Es decir. sit1
arroja 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ót1
ot2
subproceso (en este caso, elmain
método), main esperará hastat1
yt2
finalizará su tarea.Sin embargo, un punto importante a tener en cuenta,
t1
yt2
ellos mismos pueden ejecutarse en paralelo, independientemente de la secuencia de llamada de combinación ent1
yt2
. Es elmain/daemon
hilo 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 quet1
termine 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 quet1
se 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
Thread
objeto cuyo hilo se está ejecutando actualmente,Si t2 es un
Thread
objeto cuyo hilo se está ejecutando actualmente,join
API 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
ExecutorService
Executors
(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