Hallo Forum,
ich habe unten mal einen kleinen Code angehängt, den ich geschrieben habe um meine Frage zu verdeutlichen.
Es werden 20 Threads gestartet, die nach dem Start schlafen gehen und aufs Wecken warten. Irgendwann wird ein notify() ausgeführt und schafft es den größten Teil der Threads zu wecken. Aber wieso?
Wieso kann ein notify() manchmal sogar alle Threads wecken? Ich würde erwarten, dass das notify() einen Thread weckt (der daraufhin stirbt) und die restlichen Threads müssten doch eigentlich für immer weiterlaufen? Weiterhin würde ich denken, das notifyAll() eben dazu da ist alle Threads zu wecken.
Wenn mir jemand erklären könnte, warum das nicht so ist, wäre ich dankbar.
Gruß,
Ralf
ich habe unten mal einen kleinen Code angehängt, den ich geschrieben habe um meine Frage zu verdeutlichen.
Es werden 20 Threads gestartet, die nach dem Start schlafen gehen und aufs Wecken warten. Irgendwann wird ein notify() ausgeführt und schafft es den größten Teil der Threads zu wecken. Aber wieso?
Wieso kann ein notify() manchmal sogar alle Threads wecken? Ich würde erwarten, dass das notify() einen Thread weckt (der daraufhin stirbt) und die restlichen Threads müssten doch eigentlich für immer weiterlaufen? Weiterhin würde ich denken, das notifyAll() eben dazu da ist alle Threads zu wecken.
Wenn mir jemand erklären könnte, warum das nicht so ist, wäre ich dankbar.
Gruß,
Ralf
Java:
package thread;
class Warter extends Thread {
Fred f;
public Warter(Fred f) {
this.f=f;
}
@Override
public void run() {
System.out.println("Warter ist gestartet");
synchronized(f) {
try {
f.wait();
} catch (InterruptedException ex) { }
}
System.out.println("Warter endet");
}
}
class Fred extends Thread {
@Override
public void run() {
synchronized(this) {
notify();
}
}
}
public class Main {
public static void main(String[] args) {
Fred f=new Fred();
for(int i=0; i<20; i++) new Warter(f).start();
f.start();
}
}