W szczególności, czy ktoś może mi powiedzieć, co jest nie tak z tym kodem. Powinien uruchomić wątki, więc powinien wydrukować "Wprowadzanie wątku .." 5 razy, a następnie poczekać na wywołanie funkcji notifyAll(). Ale losowo drukuje "Wprowadzanie ..." i "Gotowe ..." i wciąż czeka na innych.Jak używać protokołu oczekiwania i powiadamiania z wieloma wątkami
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();
}
}
}
Dzięki Scott za odpowiedź. Myślę, że prostym rozwiązaniem byłoby umieszczenie Thread.sleep (1000) tuż przed notifyAll(), aby upewnić się, że wszystkie wątki przeszły w stan wait(). – figaro
To może dobrze działać, ale jest to trochę naiwne rozwiązanie. Jeśli chcesz wykonać więcej pracy przed wywołaniem oczekiwania, jeśli konieczne będzie, aby wątki robocze zostały zwolnione tak szybko, jak to możliwe, lub nawet jeśli wątki robocze potrwają dłużej niż oceniłeś, wystąpi ten sam problem. * Musisz * używać blokowania. Właśnie o to chodzi w programowaniu współbieżnym. Spójrz na kod Davida Blevina: jest to doskonały przykład wykorzystania blokad odliczania. – Scott