Específicamente, ¿alguien puede decirme qué está mal con este fragmento de código? Debería iniciar los hilos, por lo que debería imprimir "Ingresando hilo ..." 5 veces y luego esperar hasta que se llame a notifyAll(). Pero, al azar, imprime "Entrando ..." y "Hecho ..." y sigue esperando a los demás.Cómo usar el protocolo de esperar y notificar con varios hilos
public class ThreadTest implements Runnable {
private int num;
private static Object obj = new Object();
ThreadTest(int n) {
num=n;
}
@Override
public void run() {
synchronized (obj) {
try {
System.out.println("Entering thread "+num);
obj.wait();
System.out.println("Done Thread "+num);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
Runnable tc;
Thread t;
for(int i=0;i<5;i++) {
tc = new ThreadTest(i);
t = new Thread(tc);
t.start();
}
synchronized (obj) {
obj.notifyAll();
}
}
}
Gracias Scott por la respuesta. Supongo que una solución simple aquí sería poner Thread.sleep (1000) justo antes de notifyAll() para asegurarse de que todos los hilos hayan entrado en su estado de espera() – figaro
Eso bien podría funcionar, pero es una solución ingenua. Si desea hacer más trabajo antes de la llamada de espera, si es necesario que los hilos de trabajo se liberen lo antes posible o incluso si los hilos de trabajo solo tardan más de lo que había estimado, se encontrará con el mismo problema. Usted * debe * usar el bloqueo. De eso se trata la programación simultánea. Eche un vistazo al código de David Blevin: es un excelente ejemplo de cómo usar los bloqueos de cuenta atrás. – Scott