wait() and notify() mit mehreren Prozessen

Status
Nicht offen für weitere Antworten.
H

hanulli

Gast
Hallo liebe Community;

Ich hab folgendes Problem:
Die Methoden wait() und notify müssen immer mit synchronisiert werden. Das Synchronisieren mach ich mit dem Befehl:
synchronized (object){ wait();}
Doch wie gestalte ich den diesen Befehl, bzw. welches object übergebe ich in diesem Befehl, wenn das Object -bzw, die Prozedur -, die dann später den notify()-befehl ausführt, zu dem Zeitpunkt der Initialisierung der wait() Methode noch nicht feststeht?

Ich hoffe, ihr habt meine Fragestellung verstanden! Falls nicht gebe ich noch ein kleines Beispiel:
Das folgende Programm erzeugt verschiedene Objekte namens Besucher1, Besucher2....! All diese Besucher wollen Recoder ausleihen, von denen es aber nur 10 Stück gibt. D.h., wenn mehrer als 10 Besucher zur gleichen Zeit ein Recoder wollen, müssen manche Besucher warten, bis die ersten Besucher wieder gehen:

Code:
import java.util.*;
public class verleih{
	 
	public static void main(String [] args){
		String name="Besucher";
		int i=0;
		while(true){
			try{
				
				int counter=0;
				for(int d=i;d>0;d/=10){
					counter++;
				}i++;
				name=name.substring(0,name.length()-counter);
				name+=i;
			Random ran=new Random();
			Thread.sleep(ran.nextInt(1000));
			}
			catch(InterruptedException e){}
			new besucher(name).start();
		}
		
		 
	}
}
Code:
import java.util.*;
public class besucher extends Thread{
	static int recoder=10;
	static int counter2=0;
	static Vector<besucher> besuch=new Vector();
	String name;
	long neededtime;
	public besucher(String name){
		this.name=name;
	}
	
public void run(){
	Random ran=new Random();
	while(recoder==0){
		try{
			synchronized (this){  

// Das Object this hier zu übergeben ist ganz falsch... Wie mach ich es richtig?

			System.out.println(name +" will jezt ein recorder");
			long start = new Date().getTime();
			besuch.add(this);
			wait();
			long runningTime = new Date().getTime() - start;
			neededtime+=runningTime;
			System.out.println("sequencetime"+ neededtime);
			
		}}
		
		catch(InterruptedException e){}
	}
		System.out.println(name+ " hat jetzt einen bekommen");
		recoder-=1;
		try{
		sleep(ran.nextInt(12000));
		}
		catch(InterruptedException e){}
	
		
			System.out.println(name+ " ist jetzt fertig");
		
		recoder++;
		if(!besuch.isEmpty()){
	synchronized (besuch.firstElement()){
		notify();
		counter2++;
		hans.remove(besuch.firstElement());
	}}
	}
	
	
}
Ich bin für jede Hilfe dankbar!
 

Ebenius

Top Contributor
Du hast ganz allgemein einen Denkfehler. wait() und notify() gehören immer genau zu einem Objekt. Auf das selbe Objekt muss auch synchronisiert werden.

Wait
Code:
synchronized(object) {
  object.wait();
}
Notify
Code:
synchronized(object) {
  object.notify();
}
Falsch ist hingegen
Code:
synchronized(object) {
  wait(); // Hier müsste synchronized(this) benutzt werden
  notify(); // Hier müsste synchronized(this) benutzt werden
}
Exceptions habe ich in allen Beispielen absichtlich ignoriert.

Lies Dich am besten mal in das Java™ Tutorial: Concurrency ein. Der Aufwand lohnt.

Grüße, Ebenius
 
H

hannulli

Gast
Juhu;
Vielen Dank für deine Antwort, sie hat meine Frage im vollem Umfang beantwortet!
 

hdi

Top Contributor
Ich hab dazu auch noch eine Frage:

Ist dann

Code:
public synchronized void foo(){...}

das gleiche wie

Code:
public void foo(){
      synchronized(this){...}
}

:?:
 
H

hannulli

Gast
wie du oben gesehen hast, hab ich nicht wirklich Ahnung...
Aber ich hab mich heute in das Thema reingearbeitet und bin zu dem Schluss gekommen, dass es definitiv nicht das Gleiche ist:
Deine erste Anweisung synchronisiert die Methode und die zweite Anweisung ein Objekt.

Ich hab mein oben angeführtes Beispiel jetzt mit synchronisierten Methoden umgeschrieben, da es mit Objekten ja nicht geklappt hat: Falls es dich interessiert, hier ist meine neue Version:
Vllt wird die bei diesem Programm der unterschied klar:)
Code:
import java.util.*;
public class verleih{
	 
	public static void main(String [] args){
		Schalter A=new Schalter();
		String name="Besucher";
		int i=0;
		while(true){
			try{
				
				int counter=0;
				for(int d=i;d>0;d/=10){
					counter++;
				}i++;
				name=name.substring(0,name.length()-counter);
				name+=i;
			Random ran=new Random();
			Thread.sleep(ran.nextInt(1000));
			}
			catch(InterruptedException e){}
			new besucher(name,A).start();
		}
Code:
import java.util.*;
public class besucher extends Thread{
	Schalter s;
	String name;
	public besucher(String name, Schalter s){
		this.name=name;
		this.s=s;
	}
	
public void run(){
	Random ran=new Random();
	s.ausleihen(name,this);
		
		try{
		sleep(ran.nextInt(12000));
		}
		catch(InterruptedException e){}
		s.giveback(name);
	}
	
}
Code:
import java.util.Date;
import java.util.Vector;


public class Schalter {
	static int counter2=0;
	static Vector<besucher> besuch=new Vector();
	
	static long neededtime;
	static int recoder=10;
	public synchronized void ausleihen(String name, besucher b) {
			while(recoder==0){
				try{
					
					System.out.println(name +" will jezt ein recorder");
					long start = new Date().getTime();
					besuch.add(b);
					wait();
					long runningTime = new Date().getTime() - start;
					neededtime+=runningTime;
					System.out.println("wholewaitingtime "+ neededtime);
					
				}catch(InterruptedException e){}
			}
				System.out.println(name+ " hat jetzt einen bekommen");
				recoder-=1;
		
	}
		public synchronized void giveback(String name){
			System.out.println(name+ "ist jetzt fertig");
			
			recoder++;
			if(!besuch.isEmpty()){
				synchronized (besuch.firstElement()){
					notify();
				}
				
				counter2++;
				besuch.remove(besuch.firstElement());
				}
		}
		}
 

hdi

Top Contributor
Hm, ist mir nicht wirklich kar. Ich denk mir nach wie vor noch dass es das selbe ist.
Wäre gut wenn ein Profi das beantworten könnte
 

Murray

Top Contributor
hannulli hat gesagt.:
Deine erste Anweisung synchronisiert die Methode und die zweite Anweisung ein Objekt.
Das stimmt nicht; synchronisiert werden können immer nur Codeabschnitte.
Bei einer Instanzmethode ist
Code:
synchronized void foo() {
  /* Methodenrumpf */
}
tatsächlich äquivalent zu
Code:
void foo() {
  synchronized  ( this){
    /* Methodenrumpf */
  }
}

//EDIT: zweiten Codeabschnitt korrigiert
 

Murray

Top Contributor
Da wird auf das Class-Objekt synchronisiert:
Code:
class Foo {
  static synchronized void foo() {
    /* Methodenrumpf */
  }
}
entspricht also
Code:
class Foo {
  static void foo() {
    synchronized ( Foo.class) {
      /* Methodenrumpf */
    }
  }
}
 

hdi

Top Contributor
Hm wie genau kann ich mir das vorstellen? Genauso wie bei Instanzen, also werden dort dann auch alle statischen Variablen und Methoden geblockt?
 

Murray

Top Contributor
Das ist alles kein Hexenwerk: ein Konstrukt
Code:
synchronized( xy) {
  /* irgendein Code */
}
(dabei ist xy irgendein Object)
stellt sicher, dass der gesamte Block in den geschweiften Klammern komplett durchlaufen wird, bevor in einem anderen Thread irgendein anderer Codeblock, der auf dasselbe Objekt xy synchronisiert, läuft.

Da werden keine Variablen irgendwie "geblockt" (was auch immer das bedeuten soll).
 

hdi

Top Contributor
Naja Monitoring mit Semaphoren, das ist ja das Konzept das Java verwendet bei Synchronisation.
Da wird "geblockt", dadurch dass eine Lock-Variable gesetzt wird.

Aber es ist mir noch immer unklar: Bei statischen Methoden hat man ja kein Objekt.
Ich meine was ist wenn du in einer Klasse eine statische Methode hast, die synchronized ist,
und jetzt machst du dir eine Instanz dieser Klasse, und rufst eine nicht-statische Methode darauf auf.
Hat das was miteinander zu tun? Es läuft einfach darauf hinaus, dass ich mir auch gar nicht vorstellen
kann, wann man denn statische Methoden synchronisieren sollte. Vllt gibst du mir ein Beispiel? Dann
denk ich kann ich das leichter verstehen.
 

Murray

Top Contributor
Wenn man eine Instanzmethode und eine statische Methode miteinander synchronisieren will ( = sicherstellen will, dass kein Thread eine der beiden Methoden bearbeiten kann, solange noch ein anderer Thread in einer der beiden Methoden steckt), dann ginge das so:

Code:
class Foo {
  static synchronized void foo1() {
    /* Methodenrumpf */
  }

  void foo2() {
    synchronized( getClass()) {
      /* Methodenrumpf */
    }
  }
}

Oder auch so:
Code:
class Foo {
  static final Object monitor = new Object();

  static void foo1() {
    synchronized( monitor) {
      /* Methodenrumpf */
    }
  }

  void foo2() {
    synchronized( monitor) {
      /* Methodenrumpf */
    }
  }
}
 

Ebenius

Top Contributor
Murray hat gesagt.:
Code:
class Foo {
  static synchronized void foo1() {
    /* Methodenrumpf */
  }

  void foo2() {
    synchronized( getClass()) {
      /* Methodenrumpf */
    }
  }
}
Das ist falsch. Richtig wäre:
Code:
void foo2() {
  synchronized(Foo.class) {
    /* Methodenrumpf */
  }
}
Der Unterschied wird klar, wenn man sowas probiert:
Code:
new Foo(){}.foo2();

Ebenius
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
mrbig2017 Threads wait wird nicht durch notify beendet! Allgemeine Java-Themen 3
G Threads Threadprogrammierung wait() und notify() Allgemeine Java-Themen 4
T Wait/Notify() bei Thread Allgemeine Java-Themen 6
B Threads Barrier mit wait()/notify() aber nicht alle Prozesse terminieren Allgemeine Java-Themen 2
P Threads abwechseln lassen mit wait() und notify() Allgemeine Java-Themen 2
M Java Threads - Wait Notify - Verständnisproblem Allgemeine Java-Themen 5
K Threads wait() und notify() Allgemeine Java-Themen 8
Q Frage zu Threads ( notify() wait() ) Allgemeine Java-Themen 6
G Thread wait, notify Allgemeine Java-Themen 4
A thread1 stoppt thread2 mit wait() und notify() ? Allgemeine Java-Themen 3
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
J Thread wait() Allgemeine Java-Themen 2
J Swing Cursor.WAIT funktioniert nicht nach JFileChooser Allgemeine Java-Themen 1
A System freezes when trying to run external command from Java with wait for Allgemeine Java-Themen 3
T Threadsicheres wait() [lock erst mit wait() abgeben] Allgemeine Java-Themen 31
J synchronized block mit this und wait() Allgemeine Java-Themen 5
G Process.wait() auf Folgeprozesse mitwarten Allgemeine Java-Themen 29
G Thread wait() auf Nicht-Thread Klasse Allgemeine Java-Themen 5
M Thread mit wait anhalten, wie weiterlaufenlassen? Allgemeine Java-Themen 3
M wait in Thread einschieben? Allgemeine Java-Themen 4
C p.wait() bremst aus Allgemeine Java-Themen 4
N java.lang.IllegalMonitorStateException: object not locked by thread before notify() Allgemeine Java-Themen 2
B notify() - was passiert danach genau? Allgemeine Java-Themen 8
L Producer/Consumer Thread mit notify auf File Allgemeine Java-Themen 5
G notify() was wird verständigt Allgemeine Java-Themen 5
K synchronized und notify / notifyAll Allgemeine Java-Themen 8
G MVC-Konzept - effizienz beim "notify" Allgemeine Java-Themen 2
M Unterschied notify() und notifyAll() Allgemeine Java-Themen 1
S Unterschied zwischen notify() und notifyAll() Allgemeine Java-Themen 2
B Ein Objekt einer Klasse mehreren anderen Klassen zur Verfügung stellen? Allgemeine Java-Themen 6
X Regex mit mehreren Bedingungen machen Allgemeine Java-Themen 5
P Projekte entwickeln mit mehreren Personen Allgemeine Java-Themen 1
C Aus MEHREREN Excel Tabellen bestimmte Zelle addieren Allgemeine Java-Themen 1
D Objekt-Suche mit mehreren optionalen Parametern Allgemeine Java-Themen 6
M JavaFX Button mit mehreren Aktionen? Allgemeine Java-Themen 7
J Soap Client mit mehreren URLs in Servlets Allgemeine Java-Themen 0
J Aus mehreren Klassen ein Datei ausführbare machen Allgemeine Java-Themen 6
I Anwendung auf Netzlaufwerk von mehreren Usern gleichzeitig nutzbar. Allgemeine Java-Themen 3
M Klassen Eine Klasse in mehreren Klassen einbinden Allgemeine Java-Themen 11
perlenfischer1984 Testng : Funktion mit mehreren Parametern testen Allgemeine Java-Themen 5
I Methoden Schnelle Hilfe benötigt - Kleines Video/Slideshow aus mehreren Bildern erstellen Allgemeine Java-Themen 3
F JScrollPane mit mehreren Panels Allgemeine Java-Themen 1
S Text in mehreren Sprachen korrekt darstellen? Wie waehle ich die Fonts aus..? Allgemeine Java-Themen 0
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
AssELAss String mit mehreren Zahlungsbeträgen formatieren Allgemeine Java-Themen 10
Thallius Speicherverhalten von Properties und mehreren Threads Allgemeine Java-Themen 5
C DBConnection als Methode in mehreren Klassen Allgemeine Java-Themen 4
7 Verbinden von Mehreren Klassen Allgemeine Java-Themen 29
A Thread: Code paralell ausführen in mehreren Instanzen Allgemeine Java-Themen 1
M Interface Generische Klassen mit mehreren Typen überschreiben Allgemeine Java-Themen 0
J Projekt mit mehreren Einzelprogrammen Allgemeine Java-Themen 2
K Laufzeitermittlung an PCs mit mehreren Prozessorkernen Allgemeine Java-Themen 5
Jats Hilfe bei Bank mit mehreren Klassen Allgemeine Java-Themen 11
D Von mehreren Objekten eine Eigenschaft abfragen Allgemeine Java-Themen 11
B Rechnen mit mehreren Variablen Allgemeine Java-Themen 2
S Objekt synchronisieren, sodass es nicht von mehreren Threads benutzt wird..? Allgemeine Java-Themen 2
L Zugriff auf ein Objekt mit mehreren Threads Allgemeine Java-Themen 11
L Warten bei mehreren Threads, bis Ende erreicht ist Allgemeine Java-Themen 2
D JTabel sortieren nach mehreren kriterien Allgemeine Java-Themen 3
K System.exec() Programm mit mehreren Parametern Allgemeine Java-Themen 8
V aus mehreren jar files, ein großes basteln Allgemeine Java-Themen 22
W Map / Tupel aus mehreren Elementen? Allgemeine Java-Themen 8
V javadoc mergen / aus mehreren eclipse plugins ein javadoc Allgemeine Java-Themen 3
E Aus mehreren PDFs eines machen, zusammenfügen mittels iText Allgemeine Java-Themen 1
reibi Classenpath mit mehreren gleichen jar-Files Allgemeine Java-Themen 7
M Die gleiche Klasse in mehreren JAR files Allgemeine Java-Themen 5
T Problem mit mehreren Fenstern Allgemeine Java-Themen 2
P HashMap mit mehreren gleichen keys Allgemeine Java-Themen 4
E focus problem (mit mehreren frames) Allgemeine Java-Themen 10
B Serialisieren von mehreren Objekten Allgemeine Java-Themen 7
C Auswahl einer Version, bei mehreren installierten Versionen Allgemeine Java-Themen 3
O System.nanoTime() einheitlichen Wert auf mehreren Rechnern? Allgemeine Java-Themen 9
S ArrayList nach mehreren Spalten sortieren? Allgemeine Java-Themen 13
D Werte aus mehreren getMethoden auslesen Allgemeine Java-Themen 2
S Vererbung von mehreren Klassen? Allgemeine Java-Themen 5
M Alle möglichen Kombinationen von mehreren Objekten berechnen Allgemeine Java-Themen 6
B Aus mehreren Fenstern(Dialogen) eins machen! Allgemeine Java-Themen 2
C Map(Key/Value) mit mehreren Values Allgemeine Java-Themen 16

Ähnliche Java Themen

Neue Themen


Oben