Java - AYUDA!!!!!! , ESPERA DE HILOS?????

 
Vista:

AYUDA!!!!!! , ESPERA DE HILOS?????

Publicado por edna (16 intervenciones) el 18/06/2007 17:15:22
Hola a todos, tengo una duda muy grande, tengo un programa que lanza 3 hilos al mismo tiempo dentro de un while, tengo que hacer una operacion despues de que estos 3 hilos terminaron su ejecucion, es decir quiero que hasta cierto punto se junten los hilos para poder continuar , y ahora estoy utilizando un join de cada hilo, pero este proceso es algo lento para lo que quiero, no se si hay otra manera de hacer que los hilos se esperen en un determinado punto para terminar o algo asi.

Este es mi codigo

while(variable)
{

Thread t1 = new Thread(this, "art");
Thread t2 = new Thread(this, "alb");
Thread t3 = new Thread(this, "trk");

t3.start();
t1.start();
t2.start();

t1.join();
t2.join();
t3.join();

//// Mis operaciones
}

Gracias y saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:AYUDA!!!!!! , ESPERA DE HILOS?????

Publicado por Pablo (39 intervenciones) el 18/06/2007 21:51:49
A ver, divagando un poco, podrías tener:
-Otro hilo adicional que realice las operaciones que están debajo del join
-Borrar los join
-Arrancar el hilo junto con los demás
-hacer que el hilo tenga un wait(); hasta que se de la condición de que los restantes terminaron (para esto podrías incluir un monitor adicional)

Sin embargo, todavía vas a tener que esperar que finalicen los restantes hilos. Lo bueno en este caso es que puedes hacer el nuevo hilo un poco más complejo para que realice operaciones intermedias a medida que van terminando cada uno de los hilos restantes y así ahorrar un poco de tiempo.

Cuenta como te fue y si lo solucionaste de alguna manera, estoy interesado.

Saludos
Pablo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA!!!!!! , ESPERA DE HILOS?????

Publicado por edna (16 intervenciones) el 18/06/2007 23:28:46
Gracias por el tip, hasta ahora no he podido solicionarlo ya que si pongo que mi proceso despues del join este en otro hilo, entonces conforme los otros hilos van terminando continuan con el while sin que esta parte haya terminado lo cual me genera un error, por que en mi codigo no puedo tomar el siguiente elemnto del while hasta que se acabe el proceso despues de los joins :(

Saludos
edna
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA!!!!!! , ESPERA DE HILOS?????

Publicado por Gonzalo (180 intervenciones) el 19/06/2007 09:02:02
No acabo de entender el problema.

Por lo que dices:
- Lanzas 3 threads
- Tienes que esperar a que acaben los 3 threads
- Cuando hayan acabado los 3 threads entonces puedes continuar con el siguiente paso.

¿Es eso, no?

Entonces... dices que hacer un join de los 3 hilos es lento, pero ¿qué otra cosa podrías hacer?

Imagina que Pedro, Pablo y Juan tienen que darte cada uno un papel. Y tú, cuando los tengas, los tienes que grapar y entregarlos. Mientras ellos escriben, tú esperas. Hasta que no tengas los papeles, no puedes hacer nada. Pero ¿es lento lo que tú haces? ¿es lento esperar? No, serán lentos ellos. Son ellos los que tardan. ¿Cómo puedes tú "esperar más rápido"?

Así que si tardan mucho tus threads, prueba a hacer que tarden menos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA!!!!!! , ESPERA DE HILOS?????

Publicado por edna (16 intervenciones) el 19/06/2007 17:10:25
Si exacto , esa era mi duda, segun yo es la unica forma de esperar, pero mi jefe me comenta que debe de haber otra que tarde menos, sincronizando los hilos o algo asi, pero pues yo no le veo por donde :( !!

Gracias por los comentarios
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA!!!!!! , ESPERA DE HILOS?????

Publicado por Gonzalo (180 intervenciones) el 19/06/2007 22:33:06
Bueno, todo depende siempre que que realmente tengas que esperar.

Es decir... el uso de threads es (por lo menos teóricamente) la forma de hacer varias cosas a la vez. La dificultad viene cuando para hacer una determinada tarea A necesitas que antes se haya realizado por completo una tarea B (o varias tareas, B, C, D, etc).

Si realmente es así tu situación, pues no, no hay otro modo; hay que esperar.

Lo que puede ser (pero tendrás que pensarlo tú) es que no necesites que las tareas B, C y D hayan terminado por completo antes de empezar con A. Si eso es así, siempre puedes dividir tus tareas en tareas más pequeñas.

Lo que tendrás que hacer (o revisar si ya lo has hecho) es un análisis de las tareas, con sus flujos y sus dependencias. Mira si se pueden dividir en tareas menores que permitan que otras tareas avancen.


Pero si realmente tu caso es tal cual que hay que esperar a que esas tres tareas terminen, pues entonces hay que esperar.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA!!!!!! , ESPERA DE HILOS?????

Publicado por edna (16 intervenciones) el 19/06/2007 23:05:06
Bueno si entiendo la idea de los hilos, lo que pasa es que yo este codigo lo tenia de forma secuencial, lo cual consiste basicamente en insertar primero en 3 tablas basicas y despues insertar a 3 tablas secundarias, para las cuales se insertan los datos que se obtuvieron de las primeras tablas, pero se quizo mejorar este proceso, y se penso en hilos, por lo que busque lanzar 3 hilos que insertaran al mismo tiempo cada uno en su tabla correspodiente y despues pasar a la tablas secundarias, pero resulta que la diferencia de tiempos entre el secuencial y esta idea con hilos es casi insignificante, a veces hasta es m'as rapido en secuencial, y po eso creo que los joins que estoy ocupando meten un tiempo con lo que el secuencial iguala estos tiempos :s

No se si me doy a entender, por eso busco una forma en la que a lo mejor se puedan suprimir los joins y pueda simular el mismo proceso, pro que hasta ahora no tengo diferencias entre secuencial y con hilos :(


Gracias
edna
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA!!!!!! , ESPERA DE HILOS?????

Publicado por Gonzalo (180 intervenciones) el 20/06/2007 09:50:22
Bueno, en muchos casos el uso de threads no acelera en absoluto un proceso.

En cuanto a buscar una forma de hacerlo sin tener que usar los joins ahí... es lo que te he dicho: Depende de tu proceso. Es decir, si organizas tu proceso de una forma distinta... si *puedes* organizar tu proceso de una forma distinta, rompiéndolo en tareas que se puedan hacer "a la vez", entonces puedes acelerarlo.

Pero si realmente es inevitable y las tareas posteriores *necesitan* que los 3 hilos primeros hayan terminado completamente, entonces no hay otro modo. Si pudieras ir haciendo alguna tarea mientras, podrías ganar tiempo, pero si no, pues no hay manera.

Lo más importante es entender que esto no es algo propio del lenguaje o de la funcionalidad disponible para usar hilos. Es algo que depende completamente de cómo sea el proceso que quieres hacer.

Por volver al ejemplo que decía antes.

Caso 1:
a. Le das un papel a cada uno de Pedro, Pablo y Juan.
b. Cada uno de ellos tiene que escribir algo en el papel y luego entregártelo.
c. Tú tienes que esperar a tener todos los papeles y luego graparlos todos juntos y entregármelos a mi.

Ellos pueden hacer sus trabajos a la vez. Pero está claro que tú *tienes* que esperar. No hay manera de que puedas empezar a grapar los papeles hasta que ellos tres no te los hayan dado.

Caso 2:
a. Le das un papel a cada uno de Pedro, Pablo y Juan.
b. Cada uno de ellos tiene que escribir algo en el papel y luego entregártelo.
c. Tú tienes que contar el número de palabras que tiene cada papel, sumarlo y luego decirme el total a mi.

Aquí sí podrías ir haciendo algo de trabajo tú. Por ejemplo, si cada vez que ellos escriben una palabra, te lo dicen, tú podrías ir contando mientras ellos escriben. Sigues teniendo que esperar a que todos ellos terminen para saber el total. Pero en cuanto terminen tú ya tendrás las palabras contadas porque ya lo has ido haciendo a la vez.


Como ves, el tener que "esperar sin hacer nada" o "poder hacer otras cosas mientras tanto" es algo que depende completamente de cuál sea el proceso.

Y por esto lo que te decía antes. Que, más que buscar una instrucción o algo del lenguaje, se trata de analizar tu proceso, romperlo en tareas lo más independientes posibles y organizarlo de otra manera.

De hecho, si vienes de un proceso secuencial, mi consejo sería olvidar el código actual, coger la descripción funcional de ese proceso (es decir, lo que se debe hacer, no cómo se debe hacer) y organizarlo desde cero.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:AYUDA!!!!!! , ESPERA DE HILOS?????

Publicado por edna (16 intervenciones) el 20/06/2007 15:02:26
Ok, eso es lo que voy a intentar, por que lo que tengo hasta ahora no me funciona como quiero.

Muchas gracias!!!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar