Organizando hilos en Java
Hola que tal compañeros...
Espero se la hayan pasado bien éste fin.
Bueno, tengo un problemilla que es el siguiente, ojala me puedan ayudar.
Necesito saber cúando ha terminado un hilo y como devolver un valor en cada uno de ellos, es decir, ejecuto 8 hilos, pero estos hilos quiero que me devuelvan un valor al metodo principal, pero necesito saber cuando ya hayan finalizado todos los hilos para obtener sus resulatados y manipularlos en otra clase.
1.- Como devolver un valor al termiar un hilo si su metodo run ee void?
2.- Como saber cúando finalize cada objeto y en que momento devolver el valor?
Espero me echen la mano con sus conocimientos.
De antemano gracias...
- Inicie sesión o regístrese para enviar comentarios
varias maneras
Puedes usar Callable o Future en vez de Runnable. Esas interfaces fueron hechas para que implementes cálculos y devuelvas un valor, y luego se pueda realizar esa operación en un hilo. En conjunto con un ThreadPool, son muy útiles, pero puedes también ejecutarlos en Threads independientes.
Pero aun si eso no existiera, tú puedes realizar un cálculo como tú quieras:
Eso lo puedes correr en un hilo aparte y tendrás dos maneras de saber si ya terminó:
Hay que considerar que
puede darte
pero
también da
, lo cual significa que ocurrió una excepción en la ejecución del
de la Tarea y por lo tanto el Thread termina su ejecución (por eso devuelve
en
) pero la tarea terminó anormalmente y por eso nunca se activó la bandera de
.
Duda
Hola ezamudio, gracias por responder.
Supongamos que tengo esto en el main:
Tarea tarea = new Tarea();
Thread t = new Thread(tarea);
t.start();
if (tarea.isListo()){
Object = tarea.getResultado();
//UTILIZANDO RESULTADO
}
Estos solo lo hará una vez, es decir, ejecuta el hilo e inmediatamente el if, pero suponiendo que el hilo aun no termina me dará falso ya no preguntara de nuevo si ya terminó, es recomendable meterlo en un ciclo, si es esto que valido? o meter los hilos dentro de un hilo principal? en éste caso como gestiono los hilos hijos?
Garacias
Saludos.
ciclo
con ciclos.
También puedes poner el
También puedes poner el resultado del calculo en un objeto compartido ( y sinchronizado ) y utilizar join para esperar a que terminen.
Aquí un ejemplo del concepto ( no necesariamente como lo tienes que hacer )
En Java 1.5 salió una biblioteca para programación concurrente, pero nunca me he dado tiempo de aprenderla, busca estos conceptos ahi mismo.
Para comparar el efecto, comenta la llamada a join :)
Hola Oscar, gracias por el
Hola Oscar, gracias por el tip.
Otra duda, se supone que cuando pogo
hilo1.start();
hilo2.start();
hilo3.start();
hilo4.start();
hilo5.start();
estos se ejecutan al mismo tiempo vdd, pero en mi caso no lo hace así, termina el primer hilo y ejecuta el siguiente y así sucesivamente, hay alguna otra manera de hacer que corran al mismo tiempo? o esto depende de la JVM y del procesador???
Espero tus comentarios, gracias.
run()
Seguramente invocas run() en vez de start(), o subclaseaste Thread y sobreescribiste start() en vez de run(). Por eso es recomendable NO subclasear Thread, mejor implementa Runnable y así te forzas a implementar run() y luego creas un Thread con el Runnable.
Hola ezamudio, estabas en lo
Hola ezamudio, estabas en lo cierto e implemente de Runnable para crear mis hilos.
Ya probe mi aplicación con sus respectivas modificaciones y la parecer corre bien, ya mañana lo probaré con mas datos a ver que sucede.
Gracias por el tip.
Saludos cordiales.
Hola chavos y no tan chavos
Hola chavos y no tan chavos jejejeje.
Les quiero consultar mas sobre el tema de hilos.
El problema es el siguiente:
Creo mis hilos con runnable guardandolos en un arreglo de runnables y otro de hilos cuando los creo con runnable para tener una referencia a ellos y después comprobar si ya terminaron; los corro pero al verificar que los hilos han terminado, esto lo hago con:
Forma 1:isAlive()==false del hilo en cuestion
Forma 2:tambien con un metodo que implemente en la clase que implementa de runnable el cual
cuando temina el proceso asigno true a una variable booleana indicando con true que ya terminó las tareas a realizar.
Pero al verificar que ya terminaron todos, me indica que es cierto, todos!!! han terminado, pero lo curioso que el último termina su tarea despúes de que compruebo si ya terminaron o no.
La comprobación la hago con un ciclo que itera los arreglos anteriores y termina cuando el tamaño de mis hilos es igual a un contador que incremento al comprobar que un determinado hilo a terminado con las dos formas mencionadas anteriormente.
No se lo que sucede, ojala y me puedan ascesorar.
Saludos, gracias.