style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

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...

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.
Imagen de ezamudio

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:

public class Tarea implements Runnable {
  private Object resultado;
  private boolean listo;
  public void run() {
    //hacer un calculo largo
    //al final indicarlo en la bandera
    listo = true;
  }
  public boolean isListo() { return listo; }
  public Object getResultado() { return listo ? resultado : null; }
}

Eso lo puedes correr en un hilo aparte y tendrás dos maneras de saber si ya terminó:

Tarea tarea = new Tarea();
Thread t = new Thread(tarea);
t.start();
//Una manera de saber si ya terminó es viendo el status del hilo
if (t.isAlive()) { /*sigue corriendo*/ }
//Otra manera es con el status de la tarea
if (tarea.isListo()) { /*ya terminó*/ }

Hay que considerar que t.isAlive() puede darte false pero tarea.isListo() también da false, lo cual significa que ocurrió una excepción en la ejecución del run() de la Tarea y por lo tanto el Thread termina su ejecución (por eso devuelve false en isAlive()) pero la tarea terminó anormalmente y por eso nunca se activó la bandera de listo.

Imagen de ghosttigger1203

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.

Imagen de ezamudio

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 )

<pre>
import java.util.List;
import java.util.Vector;
import java.util.ArrayList;
import java.util.Random;
class ThreadDemo {
  public static void main( String [] args ) throws InterruptedException {
    // mejor sería usar arraylist y sincronizar a mano.
    final List&lt;Integer&gt; resultados = new Vector&lt;Integer&gt;();
    // mejor sería usar un thread pool ( supongo :P )
    final List&lt;Thread&gt; threads      = new ArrayList&lt;Thread&gt;();
    final Random r = new Random();// para simular el calculo
    for( int i = 0 ; i &lt; 8 ; i++ ) {
        threads.add( new Thread( new Runnable() {
          public void run() {
              int i = r.nextInt(10000);
              try {
                Thread.sleep( i );
              } catch( InterruptedException ie ) {
                throw new RuntimeException( ie );
              }
              resultados.add( i );
          }
        }));
    }
    for( Thread t : threads ) {
      t.start();
    }
    for( Thread t : threads ) {
      t.join();
    }
    System.out.println("Resultados: " + resultados );

  }
}</pre>

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 :)

Imagen de ghosttigger1203

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.

Imagen de ezamudio

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.

Imagen de ghosttigger1203

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.

Imagen de ghosttigger1203

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.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">