Hallo,
ich wollte eine Barrier Klasse schreiben, die mithilfe von wait()/notify() die Threads erst weiterlaufen lässt, wenn eine bestimmte Anzahl an Threads einen bestimmten Punkt erreicht. Das Problem ist jedoch wenn der letzte Thread an diesem Punkt ankommt, dieser auch weitergeht und die anderen wecken sollte. Jedoch werden die wartenden Threads anscheinend nicht richtig geweckt. Kann mir jemand sagen wo mein Fehler liegt und warum es so wie ich das programmiert habe nicht funktioniert?
Danke im voraus!
Grüße Bastiii
ich wollte eine Barrier Klasse schreiben, die mithilfe von wait()/notify() die Threads erst weiterlaufen lässt, wenn eine bestimmte Anzahl an Threads einen bestimmten Punkt erreicht. Das Problem ist jedoch wenn der letzte Thread an diesem Punkt ankommt, dieser auch weitergeht und die anderen wecken sollte. Jedoch werden die wartenden Threads anscheinend nicht richtig geweckt. Kann mir jemand sagen wo mein Fehler liegt und warum es so wie ich das programmiert habe nicht funktioniert?
Danke im voraus!
Grüße Bastiii
Code:
public class Barrier extends Thread{
private final int threadNumber=3;
private static int anzahlAktuell=0;
public boolean cond = false;
public Barrier(){
super();
}
public synchronized void barrier(){
// anzahlAktuell.incrementAndGet();
// System.out.println(anzahlAktuell.incrementAndGet());
anzahlAktuell++;
System.out.println(anzahlAktuell);
if(anzahlAktuell == threadNumber){
cond=true;
}
while(!cond){
try{
System.out.println("Ich bin am warten "+ this.getId());
this.wait();
// this.sleep(2000);
}catch(InterruptedException e){
}
}
System.out.println("Verlasse die schleife");
// setSomething();
notifyAll();
System.out.println("Alle frei "+this.getId());
}
// public void setSomething(){
// System.out.println("Methode die alle befreit: ");
// notifyAll();
// }
public void run(){
this.barrier();
}
}
Code:
public class hilf {
public static void main(String[]args) throws InterruptedException{
Barrier b1 = new Barrier();
Barrier t1 = new Barrier();
Barrier t2 = new Barrier();
b1.start();
t1.start();
t2.sleep(4000);
t2.start();
}
}