Duda / Joins de Thread

Hola a tod@s. Estudiando este tutorial , me atore en la sección de Joins con el siguiente problema:

Hice una clase que genera un numero entero aleatorio y mientras sea diferente a ( 2 ) otro especificado en un   genera un mensaje.

 

Bueno todo mono solo para probar un ejemplo de join. En el método main crea dos hilos y los inicia, antes de iniciar el hilo helloRunnable_2, se une el hilo helloRunnable_1 al padre, para que termine y muera, tantan...

 

Esto genera algo como:
 

Y sí, jalo el ejemplo tan mini de join jejejeje.

La cosa que no entiendo es, sí yo cambio de lugar el join del método main como esto:
 

Por qué genera algo como esto (como si no hubiera tomado en cuenta nunca el join):
 

O podrían recomendarme documentación en Internet y de libre sobre Hilos (Java).

Hice pruebas de tiempo con sleep o dejar el while(true){}, crear más hilos... bueno no se me ocurre porque sucede eso...

Muchas gracias : )

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

¿Que es lo que entendiste que

¿Que es lo que entendiste que debía de pasar?

Cuando usas join el hilo actual espera a que el hilo sobre el que lo invocas termine su ejecución.

Es por eso que en tu primer ejemplo ves:

1
1
1
1
1 fin

Por que no va a avanzar a la siguiente linea hasta que termine la ejecucion, que es, sobra decirlo, exactamente lo mismo que si lo hicieras con un solo hilo ( intenta llamar:   para que veas el efecto )

Cuando pones el join hasta abajo de los dos threads, ambos correran en "paralelo" y es por eso que te sale una salida entremezclada:

2
1
1
1
2
2
1

O sea que está funcionando como debe. La pregunta es: ¿Que es lo que habías entendido que iba a hacer? Quizá así te podría explicar porque no sale lo que esperas ( quizá lo que esperas tiene otro nombre ).

Imagen de ezamudio

join

El método join causa que el Thread desde donde invocaste ese método, se bloquee hasta que el thread invocado termine. En tu ejemplo, cuando invocas helloRunnable_1.join() lo que causas es que el thread principal (que no hace nada realmente) se bloquee hasta que el thread helloRunnable_1 termine su ejecución.

O qué, pensabas que se iba a unir con el hilo helloRunnable_2? Cómo sería eso posible, si helloRunnable_1 no sabe de la existencia de helloRunnable_2?

Imagen de rodrigo salado anaya

Duda / Joins de Thread: segun yo...

Según yo se preparan los dos hilos, se ponen en espera de su turno para CPU, lo toman, luego empieza el hilo-1, luegito el hilo-2, sacaría algo como

 

Hasta que llegue el join y solo salga
 

En resumen, tendría que terminar primero el hilo-1, pero creoooooo jejeje que eso se resuelve con una sincronizada... pero esa duda me la quedo para otra entrada : ) y sip ya entendí...

Según yo: Cuando inicia el hilo-1 y hilo-2, y nunca le digo al hilo-2 que se detenga a causa del hilo-1. Pues síp Oscar correrán en paralelo : ), gracias por la explicación me sirvió mucho a entender una ligera diferencia : )

Imagen de rodrigo salado anaya

join: segun yo...

Si @Ezamudio ya entendí como va esto del join, he usado esto antes en varias ocasiones pero nunca sin entender los por qué claramente. Y pretendo entender lo mas que pueda del tema. Me podrías pasa la liga del material del curso que diste a la comunidad y otras???

Gracias por la explicación :) bye...

Segun te entiendo, lo que tu

Segun te entiendo, lo que tu esperabas es que: "Corriera el hilo 1 y hasta que terminara se ejecutara el hilo 2"?

Sucede que ( y esto no es muy claro ) en realidad tu tienes tres hilos ahí.

1.- El hilo principal que esta corriendo en el método main
y
2 y 3 , pues tus dos thread creados.

Entonces cuando dices:   en realidad es el hilo main el que está esperando a que el thread "uno" termine. Y hasta entonces va a ejecutar la siguiente linea ( donde se inicia el hilo dos )

Si lo que quieres es que el hilo 2 se detenga hasta que el 1 termine, lo que podrías hacer es llamar   pero dentro del hilo que va a a esperar

Algo como:

 

Lo de sincronizar se usa cuando estás compartiendo datos, en este ejemplo no estás compartiendo datos, y los métodos clave ahí son   y   ( extrañamente no de la clase  , sino de la clase   ) sucede que en Java cada objeto puede ser un "lock" un candado.

También están las nuevas utilirias agregadas en Java 5, pero para serte sincero, jamás me he dado tiempo de aprenderlas.

Revisalas y mira si te sirven. Cuando llegues a la parte de compartir datos te pongo un ejemplo de   y  

Ahi te va la salida del código:
 

Imagen de rodrigo salado anaya

Gracias por el tip...

Excelente Oscar, gracias por el tip. Y sí, cuando llegue a el tema de Synchronization, ya preguntare más dudas :D.. A y también gracias por:  . : )

Imagen de ezamudio

material

Sesión 9 del PCJ

Imagen de rodrigo salado anaya

Material PCJ 9....

Gracias @Ezamudio, Solo recordaba la liga al zip. Esta super, le dedicare un rato para estudiarlo : )

EDIT: A no ma, el material esta fregon... y con bonus y toda la onda :D...

Imagen de rodrigo salado anaya

Ejemplo de Join

Dejo un muy sencillo ejemplo de Join, ya sin mi duda, por si alguien lo necesita. De poco sirve a enriquecer este hilo en el foro, pero tiene unas ligeras diferencias a los demás ejemplos, espero le ayuda a alguien.

 
 
 

Se podría esperar que se preparen los dos primeros threads, que tomen su lugar en CPU, luego solo se ejecute hasta que finalice el thread-0 y el thread-1 y por ultimo se ejecuta el thread-2.

Si vemos la salida no concuerda y pues con aumentar el valor del contador de 16 a 100 o un poco más y se verán los cambios, es por lo rápido del proceso.

Y el por qué inicia el hilo-1 y no el hilo-0? Es por que le gano en la competencia del CPU : ).
Bye : ).