Ver Mensaje Individual
  #2 (permalink)  
Antiguo 02/04/2014, 04:50
Avatar de rgf1987
rgf1987
 
Fecha de Ingreso: diciembre-2012
Ubicación: Asturias
Mensajes: 269
Antigüedad: 11 años, 4 meses
Puntos: 22
Respuesta: Duda Ejecución Hilos

me auto respondo, lo hice de esta forma y funciona correctamente... aunque me parece demasiado lío, debería haber una forma más fácil de hacerlo:

Código Java:
Ver original
  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. class Reader extends Thread {
  5.     Calculator c;
  6.     boolean ejecutado=false;
  7.  
  8.     public Reader(Calculator calc) {
  9.         c = calc;
  10.     }
  11.  
  12.     public void run() {
  13.         synchronized (c) {
  14.             try {
  15.                 System.out.println("Waiting for calculation...");
  16.                 ejecutado=true;
  17.                 c.wait();
  18.             } catch (InterruptedException e) {
  19.             }
  20.             System.out.println("Total is: " + c.total);
  21.         }
  22.     }
  23.  
  24.     public static void main(String[] args) {
  25.         Calculator calculator = new Calculator();
  26.         List<Reader> list = new ArrayList<Reader>();
  27.         Reader reader1 = new Reader(calculator);
  28.         Reader reader2 = new Reader(calculator);
  29.         Reader reader3 = new Reader(calculator);
  30.         reader1.start();
  31.         reader2.start();
  32.         reader3.start();
  33.         list.add(reader1);
  34.         list.add(reader2);
  35.         list.add(reader3);
  36.         calculator.listReader = list;
  37.         calculator.start();
  38.     }
  39. }
  40.  
  41. class Calculator extends Thread {
  42.     int total;
  43.     List<Reader> listReader;
  44.     boolean todosEjecutados = false;
  45.     public void run() {
  46.         while(!todosEjecutados){
  47.             for(Reader r:listReader){
  48.                 if(r.ejecutado){
  49.                     todosEjecutados=true;
  50.                 }
  51.                 else{
  52.                     todosEjecutados=false;
  53.                     break;
  54.                 }
  55.             }
  56.             if(todosEjecutados!=false){
  57.                 synchronized (this) {
  58.                     for (int i = 0; i < 100; i++) {
  59.                         total += i;
  60.                     }
  61.                     notifyAll();
  62.                 }
  63.             }
  64.         }  
  65.     }
  66. }

He creado una lista con los hilos Reader, y mediante un booleano indico si el hilo ha sido ejecutado o no:

Código Java:
Ver original
  1. synchronized (c) {
  2.             try {
  3.                 System.out.println("Waiting for calculation...");
  4.                 ejecutado=true;
  5.                 c.wait();
  6.             } catch (InterruptedException e) {
  7.             }
  8.             System.out.println("Total is: " + c.total);
  9.         }

Luego cuando se llama al hilo de Calculator, recorro la lista de objetos Reader y se ejecuta un bucle infinito hasta que todos los hilos de la lista se han ejecutado.

Código Java:
Ver original
  1. while(!todosEjecutados){
  2.             for(Reader r:listReader){
  3.                 if(r.ejecutado){
  4.                     todosEjecutados=true;
  5.                 }
  6.                 else{
  7.                     todosEjecutados=false;
  8.                     break;
  9.                 }
  10.             }
  11.             if(todosEjecutados!=false){
  12.                 synchronized (this) {
  13.                     for (int i = 0; i < 100; i++) {
  14.                         total += i;
  15.                     }
  16.                     notifyAll();
  17.                 }
  18.             }
  19.         }

Me estoy liando demasiado???