Hallo,
habe eine Problem beim ausführen meines kleinen Programms. Scheinbar funktioniert der Aufruf der von wait noch nicht so richtig, hab nun schon eine weile gegooglet konnte aber nicht die passende Lösung dazu finden bzw. konnte ich diese nicht für mein Programm umsetzen.
Hier mal der code:
und die Ausgabe nach dem Start:
Am Tisch sitzen 1 (if)
Der Philosoph 3 ist jetzt Hungrig
true 1
Der Philosoph 3 hat das linke Staebchen 1 aufgenommen.
true 2
Der Philosoph 3 hat das rechte Staebchen 2 aufgenommen.
Der Philosoph 3 wird nun Essen
Der Philosoph 3 Philosophiert nun wieder.
Am Tisch sitzen 0 (setaufsichtm)
Am Tisch sitzen 1 (if)
Der Philosoph 4 ist jetzt Hungrig
true 2
Der Philosoph 4 hat das linke Staebchen 2 aufgenommen.
Am Tisch sitzen 2 (if)
Der Philosoph 1 ist jetzt Hungrig
true 4
Der Philosoph 1 hat das linke Staebchen 4 aufgenommen.
true 3
Der Philosoph 4 hat das rechte Staebchen 3 aufgenommen.
Der Philosoph 4 wird nun Essen
Der Philosoph 4 Philosophiert nun wieder.
Am Tisch sitzen 1 (setaufsichtm)
Am Tisch sitzen 2 (if)
Der Philosoph 2 ist jetzt Hungrig
true 0
Der Philosoph 2 hat das linke Staebchen 0 aufgenommen.
true 1
Der Philosoph 2 hat das rechte Staebchen 1 aufgenommen.
Der Philosoph 2 wird nun Essen
Der Philosoph 2 Philosophiert nun wieder.
Am Tisch sitzen 1 (setaufsichtm)
Am Tisch sitzen 2 (if)
Der Philosoph 5 ist jetzt Hungrig
true 3
Der Philosoph 5 hat das linke Staebchen 3 aufgenommen.
Am Tisch sitzen 3 (if)
Der Philosoph 4 ist jetzt Hungrig
true 2
Der Philosoph 4 hat das linke Staebchen 2 aufgenommen.
true 0
Der Philosoph 1 hat das rechte Staebchen 0 aufgenommen.
Der Philosoph 1 wird nun Essen
Der Philosoph 1 Philosophiert nun wieder.
Am Tisch sitzen 2 (setaufsichtm)
Am Tisch sitzen 3 (if)
Der Philosoph 3 ist jetzt Hungrig
true 1
Der Philosoph 3 hat das linke Staebchen 1 aufgenommen.
true 4
Der Philosoph 5 hat das rechte Staebchen 4 aufgenommen.
Der Philosoph 5 wird nun Essen
Der Philosoph 5 Philosophiert nun wieder.
Am Tisch sitzen 2 (setaufsichtm)
Am Tisch sitzen 3 (if)
Der Philosoph 2 ist jetzt Hungrig
true 0
Der Philosoph 2 hat das linke Staebchen 0 aufgenommen.
Am Tisch sitzen 4 (if)
Der Philosoph 1 ist jetzt Hungrig
true 4
Der Philosoph 1 hat das linke Staebchen 4 aufgenommen.
true 3
Der Philosoph 4 hat das rechte Staebchen 3 aufgenommen.
Philosoph 5 wartet auf einen Platz
Exception in thread "Thread-4" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at Tisch.setaufsichtp(Tisch.java:42)
at Philosophen.run(Tisch.java:126)
Der Philosoph 4 wird nun Essen
true 2
Der Philosoph 3 hat das rechte Staebchen 2 aufgenommen.
Der Philosoph 4 Philosophiert nun wieder.
Am Tisch sitzen 3 (setaufsichtm)
Exception in thread "Thread-3" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Tisch.setaufsichtm(Tisch.java:54)
at Philosophen.run(Tisch.java:149)
Der Philosoph 3 wird nun Essen
Der Philosoph 3 Philosophiert nun wieder.
Am Tisch sitzen 2 (setaufsichtm)
Exception in thread "Thread-2" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Tisch.setaufsichtm(Tisch.java:54)
at Philosophen.run(Tisch.java:149)
true 1
Der Philosoph 2 hat das rechte Staebchen 1 aufgenommen.
Der Philosoph 2 wird nun Essen
Der Philosoph 2 Philosophiert nun wieder.
Am Tisch sitzen 1 (setaufsichtm)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Tisch.setaufsichtm(Tisch.java:54)
at Philosophen.run(Tisch.java:149)
true 0
Der Philosoph 1 hat das rechte Staebchen 0 aufgenommen.
Der Philosoph 1 wird nun Essen
Der Philosoph 1 Philosophiert nun wieder.
Am Tisch sitzen 0 (setaufsichtm)
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Tisch.setaufsichtm(Tisch.java:54)
at Philosophen.run(Tisch.java:149)
Danke schon mal für die Hilfe.
habe eine Problem beim ausführen meines kleinen Programms. Scheinbar funktioniert der Aufruf der von wait noch nicht so richtig, hab nun schon eine weile gegooglet konnte aber nicht die passende Lösung dazu finden bzw. konnte ich diese nicht für mein Programm umsetzen.
Hier mal der code:
Code:
public class Tisch{
static int plaetze;
static Staebchen staebchen[];
static int abbruch = 0;
Philosophen philosophen[];
static int aufsicht = 0;
static Philosophen waitphilo;
Tisch(int p){
this.plaetze = p;
}
public static void main (String[] args){
Tisch meinTisch = new Tisch(5);
meinTisch.start();
meinTisch.dotry();
}
void start (){
staebchen = new Staebchen[plaetze];
philosophen = new Philosophen[plaetze];
for (int i = 0; i < plaetze; i++){
staebchen[i] = new Staebchen(i);
}
for (int i = 0; i < plaetze; i++){
philosophen[i] = new Philosophen(i);
}
for (int i = 0; i < plaetze; i++){
philosophen[i].start();
}
}
static synchronized void setaufsichtp(Philosophen a) throws InterruptedException{
if (aufsicht < (plaetze-1)){
aufsicht = aufsicht + 1;
System.out.println("Am Tisch sitzen " + aufsicht + " (if)");
}
else{
if(!(plaetze < aufsicht)){
System.out.println("Philosoph " + (a.philonummer+1) + " wartet auf einen Platz");
waitphilo = a;
waitphilo.wait();
}
aufsicht = aufsicht + 1;
System.out.println("Am Tisch sitzen " + aufsicht + " (else)");
}
}
static synchronized void setaufsichtm(){
aufsicht = aufsicht - 1;
System.out.println("Am Tisch sitzen " + aufsicht + " (setaufsichtm)");
if (waitphilo != null){
waitphilo.notify();
System.out.println("Philosoph " + waitphilo.philonummer + " wurde benachrichtigt das ein Platz frei ist");
}
}
//Test Methode
static void allStaeStatus(String a){
System.out.println(a);
for (int i = 0; i < staebchen.length; i++){
System.out.println("Staebchen " + staebchen[i].sNummer + " ist " + staebchen[i].getstatus());
}
}
void dotry() {
try {
while (System.in.read() == 0) { }
}
catch (Exception e) {
e.printStackTrace();
}
abbruch = 1;
System.out.println("Ich gehe. Auf Wiedersehen!");
}
}
class Staebchen{
int sNummer;
Staebchen(int k){
this.sNummer = k;
}
boolean verfuegbar = true;
boolean getstatus(){
return verfuegbar;
}
synchronized void setstatusfl(Staebchen a){
System.out.println(a.getstatus() + " " + a.sNummer);
if (a.getstatus() == false){
while (!a.getstatus()){}
}
else {
verfuegbar = false;
}
}
void setstatustr(){
verfuegbar = true;
}
}
class Philosophen extends Thread {
int philonummer;
statusPhilo sP = statusPhilo.Philosophiert;
Staebchen linkesstaebchen;
Staebchen rechtesStaebchen;
Philosophen(int a){
philonummer = a;
rechtesStaebchen = Tisch.staebchen[a];
if (philonummer == 0){
linkesstaebchen = Tisch.staebchen[Tisch.plaetze-1];
}
else{
linkesstaebchen = Tisch.staebchen[a-1];
}
}
void setstatusPhilo(statusPhilo e){
sP = e;
}
statusPhilo getstatusPhilo(){
return this.sP;
}
public void run(){
try{
while(Tisch.abbruch == 0){
this.sleep((long)(Math.random()*1000));
Tisch.setaufsichtp(this);
this.setstatusPhilo(statusPhilo.Hungrig);
System.out.println("Der Philosoph " + (philonummer+1) + " ist jetzt " + this.sP);
linkesstaebchen.setstatusfl(linkesstaebchen);
//Tisch.allStaeStatus("Linkesstaebchen false");
System.out.println("Der Philosoph " + (philonummer+1) + " hat das linke Staebchen " + linkesstaebchen.sNummer + " aufgenommen.");
this.sleep((long)(Math.random()*1000));
while (!rechtesStaebchen.getstatus()){}
rechtesStaebchen.setstatusfl(rechtesStaebchen);
//Tisch.allStaeStatus("Rechtesstaebchen false");
System.out.println("Der Philosoph " + (philonummer+1) + " hat das rechte Staebchen " + rechtesStaebchen.sNummer + " aufgenommen.");
this.sleep((long)Math.random()*1000);
this.setstatusPhilo(statusPhilo.Essen);
System.out.println("Der Philosoph " + (philonummer+1) + " wird nun " + this.getstatusPhilo());
this.sleep((long)Math.random()*1000);
linkesstaebchen.setstatustr();
//Tisch.allStaeStatus("Linkesstaebchen true");
this.sleep((long)Math.random()*1000);
rechtesStaebchen.setstatustr();
//Tisch.allStaeStatus("Rechtesstaebchen true");
this.setstatusPhilo(statusPhilo.Philosophiert);
System.out.println("Der Philosoph " + (philonummer+1) + " " + this.getstatusPhilo() + " nun wieder.");
Tisch.setaufsichtm();
this.sleep((long)Math.random()*1000);
}
}
catch (InterruptedException e){
System.out.println("Fehler");
}
}
}
enum statusPhilo{
Philosophiert, Essen, Hungrig;
}
und die Ausgabe nach dem Start:
Am Tisch sitzen 1 (if)
Der Philosoph 3 ist jetzt Hungrig
true 1
Der Philosoph 3 hat das linke Staebchen 1 aufgenommen.
true 2
Der Philosoph 3 hat das rechte Staebchen 2 aufgenommen.
Der Philosoph 3 wird nun Essen
Der Philosoph 3 Philosophiert nun wieder.
Am Tisch sitzen 0 (setaufsichtm)
Am Tisch sitzen 1 (if)
Der Philosoph 4 ist jetzt Hungrig
true 2
Der Philosoph 4 hat das linke Staebchen 2 aufgenommen.
Am Tisch sitzen 2 (if)
Der Philosoph 1 ist jetzt Hungrig
true 4
Der Philosoph 1 hat das linke Staebchen 4 aufgenommen.
true 3
Der Philosoph 4 hat das rechte Staebchen 3 aufgenommen.
Der Philosoph 4 wird nun Essen
Der Philosoph 4 Philosophiert nun wieder.
Am Tisch sitzen 1 (setaufsichtm)
Am Tisch sitzen 2 (if)
Der Philosoph 2 ist jetzt Hungrig
true 0
Der Philosoph 2 hat das linke Staebchen 0 aufgenommen.
true 1
Der Philosoph 2 hat das rechte Staebchen 1 aufgenommen.
Der Philosoph 2 wird nun Essen
Der Philosoph 2 Philosophiert nun wieder.
Am Tisch sitzen 1 (setaufsichtm)
Am Tisch sitzen 2 (if)
Der Philosoph 5 ist jetzt Hungrig
true 3
Der Philosoph 5 hat das linke Staebchen 3 aufgenommen.
Am Tisch sitzen 3 (if)
Der Philosoph 4 ist jetzt Hungrig
true 2
Der Philosoph 4 hat das linke Staebchen 2 aufgenommen.
true 0
Der Philosoph 1 hat das rechte Staebchen 0 aufgenommen.
Der Philosoph 1 wird nun Essen
Der Philosoph 1 Philosophiert nun wieder.
Am Tisch sitzen 2 (setaufsichtm)
Am Tisch sitzen 3 (if)
Der Philosoph 3 ist jetzt Hungrig
true 1
Der Philosoph 3 hat das linke Staebchen 1 aufgenommen.
true 4
Der Philosoph 5 hat das rechte Staebchen 4 aufgenommen.
Der Philosoph 5 wird nun Essen
Der Philosoph 5 Philosophiert nun wieder.
Am Tisch sitzen 2 (setaufsichtm)
Am Tisch sitzen 3 (if)
Der Philosoph 2 ist jetzt Hungrig
true 0
Der Philosoph 2 hat das linke Staebchen 0 aufgenommen.
Am Tisch sitzen 4 (if)
Der Philosoph 1 ist jetzt Hungrig
true 4
Der Philosoph 1 hat das linke Staebchen 4 aufgenommen.
true 3
Der Philosoph 4 hat das rechte Staebchen 3 aufgenommen.
Philosoph 5 wartet auf einen Platz
Exception in thread "Thread-4" java.lang.IllegalMonitorStateException
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:485)
at Tisch.setaufsichtp(Tisch.java:42)
at Philosophen.run(Tisch.java:126)
Der Philosoph 4 wird nun Essen
true 2
Der Philosoph 3 hat das rechte Staebchen 2 aufgenommen.
Der Philosoph 4 Philosophiert nun wieder.
Am Tisch sitzen 3 (setaufsichtm)
Exception in thread "Thread-3" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Tisch.setaufsichtm(Tisch.java:54)
at Philosophen.run(Tisch.java:149)
Der Philosoph 3 wird nun Essen
Der Philosoph 3 Philosophiert nun wieder.
Am Tisch sitzen 2 (setaufsichtm)
Exception in thread "Thread-2" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Tisch.setaufsichtm(Tisch.java:54)
at Philosophen.run(Tisch.java:149)
true 1
Der Philosoph 2 hat das rechte Staebchen 1 aufgenommen.
Der Philosoph 2 wird nun Essen
Der Philosoph 2 Philosophiert nun wieder.
Am Tisch sitzen 1 (setaufsichtm)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Tisch.setaufsichtm(Tisch.java:54)
at Philosophen.run(Tisch.java:149)
true 0
Der Philosoph 1 hat das rechte Staebchen 0 aufgenommen.
Der Philosoph 1 wird nun Essen
Der Philosoph 1 Philosophiert nun wieder.
Am Tisch sitzen 0 (setaufsichtm)
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at Tisch.setaufsichtm(Tisch.java:54)
at Philosophen.run(Tisch.java:149)
Danke schon mal für die Hilfe.