# IllegalMonitorStateException



## newbe (22. Jun 2009)

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:

```
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.


----------



## Marco13 (22. Jun 2009)

Hab's jetzt nicht nachvollzogen, aber dieser Fehler tritt auf, wenn man wait() oder notify()/notifyAll() auf einem Objekt aufruft, auf das man NICHT synchronized ist. Grundsätzlich also

```
synchronized (a)
{
    b.notify(); // HIER
}

// oder

public synchronized void foo()
{
    notThis.notify(); // HIER
}
```
Im speziellen passiert das bei dir in
at Tisch.setaufsichtm(Tisch.java:54)


----------



## SlaterB (22. Jun 2009)

hier ein einfacheres Programm mit denselben Fehler:

```
public class Test
{


    public static void main(String[] args)
        throws Exception
    {
        Object o = new Object();
        o.wait();
    }

}
```
wenn du noch nie irgendwo wait() aufgerufen hast, dann besser in so einfachen Programmen testen 
um wait() aufrufen zu können, muss man in einem synchronized-Block zum fraglichen Objekt sein:

```
public class Test
{


    public static void main(String[] args)
        throws Exception
    {
        Object o = new Object();
        synchronized (o)
        {
            o.wait();
        }
    }

}
```
(Vorsicht, Programm läuft ewig)


----------



## newbe (22. Jun 2009)

danke schon mal komme leider noch nicht ganz dahinter wie ich das nun in meinem programm umsetzen muss, kurze erläuterung um das vllt. schneller nachvollziehen zu können:

habe eine methode in der klasse Tisch die in der run methode der klasse Philosophen aufgerufen wird diese hier: 


```
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;
				wait();
				
			}
			aufsicht = aufsicht + 1;
			System.out.println("Am Tisch sitzen " + aufsicht +  " (else)");
		}	
	}
```

nun möchte ich wenn die bedinung 
	
	
	
	





```
if (aufsicht < (plaetze-1))
```
 nicht erfüllt wird das sich der übergebende/aufrufende Thread schlafen legt bis er durch das aufrufen von notify() in der Methode setaufsichtm() wieder erweckt wird.


```
static synchronized void setaufsichtm(){
		aufsicht = aufsicht - 1;
		System.out.println("Am Tisch sitzen " + aufsicht +  " (setaufsichtm)");
		if (waitphilo != null){
			o.notify();
			System.out.println("Philosoph " + waitphilo.philonummer + " wurde benachrichtigt das ein Platz frei ist");
		}
	}
```


----------



## bananenkasper (23. Jun 2009)

Desweiteren sollte wait immer in einer schleife aufgerufen werden!
Standard idiom für wait und notify:

```
synchronized(obj){
while(<condition does not hold>)
obj.wait(); // Releases lock, and reacquires on wakeup
// Perform action
}
```
aufwecken immer mit "notifyAll()":

```
synchronized(obj){
obj.notifyAll();
}
```


----------



## Marco13 (23. Jun 2009)

Habe es immer noch nicht komplett nachvollzogen, aber nur weil der (eigentlich) relevante Teil schongesagt wurde: In der setaufsichtm-Methode wird
o.notify();
aufgerufen - was auch immer o in diesem Fall ist, dieses o.notify(); müßte ENTWEDER in einem Block stehen der mit
synchronized(o) eingeschlossen ist, oder (was wahrscheinlicher ist) dort müßte nur
this.notify();
stehen...
Wenn's immer noch nicht klappt, schau' ich vielleicht mal richtig, wenn ich Zeit habe


----------



## newbe (23. Jun 2009)

Hallo,

habe jetzt noch mal ein kleines Programm geschrieben um nur dieses wait()/notify() nachzuvollziehen:


```
class Waittest1 {
	static int testvariable = 0;
	static Testthread schlafthread;
	static synchronized void  settestvariablep(Testthread a) throws InterruptedException{
		if (testvariable >=4){
			System.out.println("Der Thread " + a.threadnummer + " schlaeft");
			schlafthread = a;
			schlafthread.wait();
			testvariable = testvariable + 1;
			System.out.println("Der Thread " + a.threadnummer + " hat die Testvariable erhoeht der Wert ist " + testvariable);
		}
		else{ 
			testvariable = testvariable + 1;
			System.out.println("Der Thread " + a.threadnummer + " hat die Testvariable erhoeht der Wert ist " + testvariable);
		}
	}
	
	static synchronized void settestvariablem(Testthread a) throws InterruptedException {
		testvariable = testvariable - 1;
		schlafthread.notify();
		System.out.println("Der Thread " + a.threadnummer + " hat die Testvariable verringert der Wert ist " + testvariable);
	}
	public static void main (String[] args){
		Testthread tt[] = new Testthread[5];
		for (int i = 0; i < 5; i++){
			tt[i] = new Testthread(i);
		}
		for (int i = 0; i < 5; i++){
			tt[i].start();
		}
	}
}
class Testthread extends Thread {
	int threadnummer;
	
	Testthread(int a){
		threadnummer = a;
	}
	
	public void run(){
		try{
			while(true){
				Waittest.settestvariablep(this);
				sleep(5000);
				Waittest.settestvariablem(this);
				sleep(5000);
			}
		}
		catch (InterruptedException e){}
	}
}
```

die Ausgabe ist folgende:

Der Thread 0 hat die Testvariable erhoeht der Wert ist 1
Der Thread 1 hat die Testvariable erhoeht der Wert ist 2
Der Thread 2 hat die Testvariable erhoeht der Wert ist 3
Der Thread 3 hat die Testvariable erhoeht der Wert ist 4
Der Thread 4 schlaeft
Exception in thread "Thread-4" java.lang.IllegalMonitorStateException
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:485)
        at Waittest.settestvariablep(Waittest1.java:8)
        at Testthread.run(Waittest1.java:43)
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at Waittest.settestvariablem(Waittest1.java:20)
        at Testthread.run(Waittest1.java:45)
Exception in thread "Thread-1" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at Waittest.settestvariablem(Waittest1.java:20)
        at Testthread.run(Waittest1.java:45)
Exception in thread "Thread-2" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at Waittest.settestvariablem(Waittest1.java:20)
        at Testthread.run(Waittest1.java:45)
Exception in thread "Thread-3" java.lang.IllegalMonitorStateException
        at java.lang.Object.notify(Native Method)
        at Waittest.settestvariablem(Waittest1.java:20)
        at Testthread.run(Waittest1.java:45)

nun noch eins mit euren Hinweisen welches auch funktioniert:


```
class Waittest{
	static int testvariable = 0;
	static Testthread schlafthread;
	static Object o = new Object();
	static void  settestvariablep(Testthread a) throws InterruptedException{
		synchronized(o){
		if (testvariable >=4){
			System.out.println("Der Thread " + a.threadnummer + " schlaeft");
			schlafthread = a;
			o.wait();
			testvariable = testvariable + 1;
			System.out.println("Der Thread " + a.threadnummer + " hat die Testvariable erhoeht der Wert ist " + testvariable);
		}
		else{ 
			testvariable = testvariable + 1;
			System.out.println("Der Thread " + a.threadnummer + " hat die Testvariable erhoeht der Wert ist " + testvariable);
		}
		}
	}
	
	
	static void settestvariablem(Testthread a) throws InterruptedException {
		synchronized (o){
		testvariable = testvariable - 1;
		o.notify();
		System.out.println("Der Thread " + a.threadnummer + " hat die Testvariable verringert der Wert ist " + testvariable);
		}
	}
	public static void main (String[] args){
		Testthread tt[] = new Testthread[5];
		for (int i = 0; i < 5; i++){
			tt[i] = new Testthread(i);
		}
		for (int i = 0; i < 5; i++){
			tt[i].start();
		}
	}
}
class Testthread extends Thread {
	int threadnummer;
	
	Testthread(int a){
		threadnummer = a;
	}
	
	public void run(){
		try{
			while(true){
				Waittest.settestvariablep(this);
				sleep(5000);
				Waittest.settestvariablem(this);
				sleep(5000);
			}
		}
		catch (InterruptedException e){}
	}
}
```

aber ist das wirklich der richtige weg?
Gruß


----------



## SlaterB (23. Jun 2009)

die Verwendung des synchronized-Blocks ist nicht auf ein Object o eingeschränkt,
wenn du weiter auf dem schlafthread synchronisieren willst, geht das auch:

synchronized(schlafthread) {
schlafthread.wait();
}

allgemein erscheint es aber günstig, einfache Objekte statt große Threads als Monitore zu verwenden


----------



## Marco13 (23. Jun 2009)

Das war schonmal nicht ganz verkehrt. Hier nochmal ... etwas .. nachvollziehbarer, vielleicht:

```
class Waittest
{
    static int testvariable = 0;
    static Object o = new Object();

    static void settestvariablep(Testthread a) throws InterruptedException
    {
        synchronized(o)
        {
            while (testvariable >=4)
            {
                System.out.println("Der Thread " + a + " will erhöhen, wartet bis variable <4 ist...");
                o.wait();
                System.out.println("Der Thread " + a + " will erhöhen, hat gewartet, variable ist jetzt "+testvariable);
            }
            System.out.println("Der Thread " + a + " will erhöhen, und das kenn er jetzt - erhöhe " + testvariable+" um 1");
            testvariable = testvariable + 1;
        }
    }


    static void settestvariablem(Testthread a) throws InterruptedException
    {
        synchronized (o)
        {
            System.out.println("Der Thread " + a + " verringert die Testvariable von "+testvariable+" um 1");
            testvariable = testvariable - 1;
            System.out.println("Der Thread " + a + " hat die Testvariable auf " + testvariable + " verringert und sagt jetzt allen anderen bescheid");
            o.notifyAll();
        }
    }

    public static void main (String[] args)
    {
        Testthread tt[] = new Testthread[5];
        for (int i = 0; i < 5; i++){
            tt[i] = new Testthread(i);
        }
        for (int i = 0; i < 5; i++){
            tt[i].start();
        }
    }
}


class Testthread extends Thread {
    private int threadnummer;

    Testthread(int a){
        threadnummer = a;
    }

    public void run(){
        try{
            while(true){
                Waittest.settestvariablep(this);
                sleep((int)(Math.random()*3000+3000));
                Waittest.settestvariablem(this);
                sleep((int)(Math.random()*3000+3000));
            }
        }
        catch (InterruptedException e){}
    }

    public String toString()
    {
        return ""+threadnummer;
    }
}
```

Die bisherigen Hinweise mal in das ursprüngliche Programm eingebaut - ohne Anspruch auf Vollständigkeit und Korrektheit....

```
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 void setaufsichtp(Philosophen a) throws InterruptedException{
        if (aufsicht < (plaetze-1)){
            aufsicht = aufsicht + 1;
            System.out.println("Am Tisch sitzen " + aufsicht +  " (if)");
        }
        else{
            while(!(plaetze < aufsicht)){
                waitphilo = a;
                synchronized (waitphilo)
                {
                    System.out.println("Philosoph " + (a.philonummer+1) + " wartet auf einen Platz");
                    waitphilo.wait();
                }
            }
            aufsicht = aufsicht + 1;
            System.out.println("Am Tisch sitzen " + aufsicht +  " (else)");

        }
    }
    static void setaufsichtm(){
        aufsicht = aufsicht - 1;
        System.out.println("Am Tisch sitzen " + aufsicht +  " (setaufsichtm)");
        if (waitphilo != null)
        {
            synchronized (waitphilo)
            {
                waitphilo.notifyAll();
            }
            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 {
            Thread.sleep(1000000); //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;
}
```


----------



## ... (12. Jun 2011)

Auch wenns schon länger her ist:
Müsste

```
synchronized(a) 
{
    a.wait();
}
```
nicht eigentlich einen Deadlock erzeugen?
Der wartende Thread befindet sich ja im synchronized-Abschnitt, und damit darf doch notify() nicht mehr von einem anderen Thread aufgerufen werden?


----------



## Volvagia (12. Jun 2011)

Theoretisch ja, wait gibt den Monitor aber wieder frei.


----------

