Erzeuger/Verbraucher

sh33p

Bekanntes Mitglied
Ich habe folgendes Beispiel erstellt..komme aber nicht ganz klar was die Synchronisation mit wait und notify angeht. Könntet ihr mir helfen?

Java:
public class Wert {

private int x;
public boolean ok= false;

public synchronized int get(){

return x;

}
 public synchronized void put(int x){

  while(ok == false){
    try{
     ok = true;
     wait();
    }
    catch(InterruptedException e){

    }

  }
   notify();
   this.x = x;

   System.out.println(x);

 }

}

public class Erzeuger extends Thread{

Wert w;


public Erzeuger(Wert w){
  this.w = w;
}

public void run(){
  for(int i = 0; i < 7;++i){
    w.put(i);
    
    try{
      sleep((int) Math.random()*100);
    }
    catch(Exception e){

    }
  }
}
}

public class Test {

  public static void main(String[] args) {
  
    Wert w1 = new Wert();
    Wert w2 = new Wert();
    Erzeuger t1 = new Erzeuger(w2);
    Erzeuger t2 = new Erzeuger(w2);


    t1.start();
    t2.start();

  }
}
 

HoaX

Top Contributor
Was willst du machen? Was geht da jetzt nicht?

Wenn ich den Code so ansehe, dann bezweifle ich dass du verstanden hast wie notify/wait funktioniert.
Du rufst bei Wert#put wait auf. Und wo soll das Notify herkommen dass wait auch mal endet?

Ansonsten möchte ich noch anmerken, dass man Catch-Blöcke _nie_ leer lassen sollte!
 
Zuletzt bearbeitet:

sh33p

Bekanntes Mitglied
ich möchte,das eine synchronisation gewährleistet ist, wenn auf nur 1 objekt, also einem monitor ,2 threads arbeiten wie im beispiel.
 

HoaX

Top Contributor
ich möchte,das eine synchronisation gewährleistet ist, wenn auf nur 1 objekt, also einem monitor ,2 threads arbeiten wie im beispiel.

Was verstehst du unter "damit arbeitet"? Schon das synchronized bei der Methodendeklaration sollte doch vermeiden, dass beide Threads gleichzeitig die Put-Methode des selben Objekts ausführen. Wozu noch das wait/notify?
 

sh33p

Bekanntes Mitglied
ja eigentlich schon.aber die Ergebnisse in der Ausgabe sind trotzdem nicht deterministisch.

mal 00 11 22 .. mal 01023.... usw.
 

HoaX

Top Contributor
ja eigentlich schon.aber die Ergebnisse in der Ausgabe sind trotzdem nicht deterministisch.

mal 00 11 22 .. mal 01023.... usw.

Naund? Warum sollten sie es sein?

Nachtrag zur Erläuterung: Es kann durchaus sein dass Thread 1 bereits zweimal seine Schleife durchlaufen hat, wärend Thread 2 noch sonstwo feststeckt. Am Ausführen der Methode ist dennoch immer nur einer, wie du so prüfen kannst:
Code:
		public synchronized void put(int x) {
			System.out.println("IN: " + Thread.currentThread().getName());
                        ...
                        System.out.println("OUT: " + Thread.currentThread().getName());
Oder einfach mal einen Breakpoint auf die erste Zeile der Methode setzen. Wenn dieser anspringt, dann alle Threads im Debugger schlafen legen und mal den Stack ansehen.
 
Zuletzt bearbeitet:

sh33p

Bekanntes Mitglied
ok dann gehen wir das mal anders an ^^
wie kann ich mit der Technik der Synchronisation und /oder wait/notify erreichen,das ich eine solche deterministische abfolge erhalte? sprich jeder thread also abwechselnd in dieser reihenfolge seine operationen auf dem objekt durchführt, so dass ich 0 0, 1 1, 2 2, .... , n n
erhalte.
 

HoaX

Top Contributor
Wenn sie abwechselnd laufen sollen, warum dann Threads?

Das was du willst wirst du imo nicht mit nur wait/notify hinbekommen. Denn weder wait noch notify wissen, dass es mindestens zwei Threads gibt die abwechselnd ran wollen. Selbst wenn: was passiert wenn ein Thread terminiert und der andere darauf wartet, dass dieser Thread endlich seinen durchlauf macht?
 
Zuletzt bearbeitet:

HoaX

Top Contributor
Nein das meine ich nicht, und wenn du meine Erklärung oben nicht verstanden hast dann weiß ich gerade auch nicht wie ich es besser in Worte fassen kann.
Warum Threads wenn sie nacheinander und auch noch zwingend abwechselnd arbeiten sollen?
Komm doch mal in den Chat ...
 

Ähnliche Java Themen

Neue Themen


Oben