Hi, ich habe folgendes Problem: obwohl alle abfragen korrekt zu sein scheinen, werden threads die ich vorher auf wait gesetzt habe, durch notify, doer notifyAll nicht fortgesetzt. Für eine Richtigkeit der Abfragen kann ich garantieren, da das Programm richtig ausgeführt wird, wenn ich die Threads nicht vorerst stoppe sondern in einer whileschleife gefangen halte. Dies ist jedoch für mich inakzeptabel, da ich möglichst effizient programmieren möchte. Hier erstmal der Code:
Ich bin neu hier, hoffe habe mich an die Regeln gehalten und im richtigen Abschnitt des Forums gepostet. Ich möchte mich bereits im vorraus bedanken. Falls meine Angaben zu unprägnant waren, stellt bitte Fragen.
MfG,
Christoph
Java:
class Sau{
private int geschlecht, anzahl;
public Sau(){
geschlecht=0;
anzahl=0;
}
public int getGeschlecht(){
return geschlecht;
}
public int getAnzahl(){
return anzahl;
}
public void setGeschlecht(int x){
geschlecht=x;
}
public void incAnzahl(){
anzahl=anzahl + 1;
}
public void decAnzahl(){
anzahl=anzahl-1;
}
}
class Pers extends Thread{
private String name;
private int geschlecht,sleepTime;
private Sau sauna;
public Pers(String n, int g, int s, Sau sau){
name=n;
geschlecht=g;
sleepTime=s;
sauna=sau;
}
public void run(){
System.out.println("Anfang "+name);
synchronized(this){
while((sauna.getGeschlecht()!=0) && (sauna.getGeschlecht()!=geschlecht)){
/*try{
wait();
}catch(InterruptedException e){
}*/
}
System.out.println("In Sauna eingetreten! "+name);
if(sauna.getAnzahl()==0)
sauna.setGeschlecht(geschlecht);
sauna.incAnzahl();
}
try {
sleep(sleepTime);
} catch (InterruptedException e) {
}
System.out.println("Zeit in Sauna geniessen "+name);
synchronized(this){
sauna.decAnzahl();
if(sauna.getAnzahl()==0)
sauna.setGeschlecht(0);
//notifyAll();
System.out.println("Sauna verlassen "+name);
System.out.println(sauna.getGeschlecht());
}
}
}
public class SaunaSim {
public static void main(String [] args){
Sau s=new Sau();
new Pers("1",1,0,s).start();
new Pers("2",2,0,s).start();
new Pers("3",1,0,s).start();
new Pers("4",2,0,s).start();
new Pers("5",1,0,s).start();
}
}
Ich bin neu hier, hoffe habe mich an die Regeln gehalten und im richtigen Abschnitt des Forums gepostet. Ich möchte mich bereits im vorraus bedanken. Falls meine Angaben zu unprägnant waren, stellt bitte Fragen.
MfG,
Christoph