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 originalimport java.util.ArrayList;
import java.util.List;
Calculator c;
boolean ejecutado=false;
public Reader(Calculator calc
) { c = calc;
}
public void run() {
synchronized (c) {
try {
System.
out.
println("Waiting for calculation..."); ejecutado=true;
c.wait();
}
System.
out.
println("Total is: " + c.
total); }
}
public static void main
(String[] args
) { Calculator calculator = new Calculator();
List<Reader> list = new ArrayList<Reader>();
reader1.start();
reader2.start();
reader3.start();
list.add(reader1);
list.add(reader2);
list.add(reader3);
calculator.listReader = list;
calculator.start();
}
}
class Calculator
extends Thread { int total;
List<Reader> listReader;
boolean todosEjecutados = false;
public void run() {
while(!todosEjecutados){
if(r.ejecutado){
todosEjecutados=true;
}
else{
todosEjecutados=false;
break;
}
}
if(todosEjecutados!=false){
synchronized (this) {
for (int i = 0; i < 100; i++) {
total += i;
}
notifyAll();
}
}
}
}
}
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 originalsynchronized (c) {
try {
System.
out.
println("Waiting for calculation..."); ejecutado=true;
c.wait();
}
System.
out.
println("Total is: " + c.
total); }
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 originalwhile(!todosEjecutados){
if(r.ejecutado){
todosEjecutados=true;
}
else{
todosEjecutados=false;
break;
}
}
if(todosEjecutados!=false){
synchronized (this) {
for (int i = 0; i < 100; i++) {
total += i;
}
notifyAll();
}
}
}
Me estoy liando demasiado???