Hallo Liste,
<br>
ich hab jetzt schon einiges von Threads gelesen und herumexperimentiert, aber so meine Probleme mit wait bzw. notify.
<br>
Ich nehme hier ein Beispiel vom Web bei dem ich meine Verständnisfrage erläutere.
<br>
http://www.ccs.neu.edu/home/kenb/3338/tutorial.html
<br>
public class SharedStack
{
private List stack = new ArrayList();
/**
* Construct a new shared stack.
*/
public SharedStack() {}
/**
* Push a new object onto a shared stack.
* @param object The object to be pushed onto the stack.
*/
public synchronized void produce(Object object) {
stack.add(object);
notify();
}
/**
* Pop the top object off a stack or wait, if needed, until there is one.
* @return The top object on the stack.
*/
public synchronized Object consume() {
while (stack.isEmpty()) {
try {
wait();
} catch (InterruptedException e) {
}
}
int lastElement = stack.size() - 1;
Object object = stack.get(lastElement);
stack.remove(lastElement);
return object;
}
/**
* Construct a string that represents a shared stack.
* @return The string representation of a shared stack.
*/
public synchronized String contains() {
String s = "The shared stack currently contains the following:\n";
for (Iterator i = stack.iterator(); i.hasNext(); ) {
s += i.next() + "\n";
}
return s;
}
}
Ich denke, daß ich dieses Beispiel an und für sich verstehe, aber im Bezug mit anderen Klassen sieht es nicht mehr so gut aus.<br>
Wenn ich jetzt einen Thread starte, welcher die consume Funktion aufruft, dann laufe ich in den wait status ( was ich auch erwartet habe). Starte ich jetzt einen 2. Thread welcher (bezogen auf das selbe SharedStack Objekt) produce aufruft und somit auch notify sendet, dann hätte ich erwartet, daß der erste Thread (irgendwann) den wait status verläßt und mir den letzten Wert vom Stack liefert.
<br>
Dies kann ich aber nicht nachvollziehen???
<br>
Was ich auch noch nicht verstanden habe.
<br>
Das notify wird von einer Instanz des Objekt X gesendet und irgend eine Instanz des Objekt X welches im wait Status ist wird dann aus dem wait herausfallen und weiterlaufen?
<br>
Ich hoffe ich habe mich verständlich erklärt.
Es wäre nett, wenn mich jemand aufklären könnte.
<br>
lg Dietmar
<br>
ich hab jetzt schon einiges von Threads gelesen und herumexperimentiert, aber so meine Probleme mit wait bzw. notify.
<br>
Ich nehme hier ein Beispiel vom Web bei dem ich meine Verständnisfrage erläutere.
<br>
http://www.ccs.neu.edu/home/kenb/3338/tutorial.html
<br>
public class SharedStack
{
private List stack = new ArrayList();
/**
* Construct a new shared stack.
*/
public SharedStack() {}
/**
* Push a new object onto a shared stack.
* @param object The object to be pushed onto the stack.
*/
public synchronized void produce(Object object) {
stack.add(object);
notify();
}
/**
* Pop the top object off a stack or wait, if needed, until there is one.
* @return The top object on the stack.
*/
public synchronized Object consume() {
while (stack.isEmpty()) {
try {
wait();
} catch (InterruptedException e) {
}
}
int lastElement = stack.size() - 1;
Object object = stack.get(lastElement);
stack.remove(lastElement);
return object;
}
/**
* Construct a string that represents a shared stack.
* @return The string representation of a shared stack.
*/
public synchronized String contains() {
String s = "The shared stack currently contains the following:\n";
for (Iterator i = stack.iterator(); i.hasNext(); ) {
s += i.next() + "\n";
}
return s;
}
}
Ich denke, daß ich dieses Beispiel an und für sich verstehe, aber im Bezug mit anderen Klassen sieht es nicht mehr so gut aus.<br>
Wenn ich jetzt einen Thread starte, welcher die consume Funktion aufruft, dann laufe ich in den wait status ( was ich auch erwartet habe). Starte ich jetzt einen 2. Thread welcher (bezogen auf das selbe SharedStack Objekt) produce aufruft und somit auch notify sendet, dann hätte ich erwartet, daß der erste Thread (irgendwann) den wait status verläßt und mir den letzten Wert vom Stack liefert.
<br>
Dies kann ich aber nicht nachvollziehen???
<br>
Was ich auch noch nicht verstanden habe.
<br>
Das notify wird von einer Instanz des Objekt X gesendet und irgend eine Instanz des Objekt X welches im wait Status ist wird dann aus dem wait herausfallen und weiterlaufen?
<br>
Ich hoffe ich habe mich verständlich erklärt.
Es wäre nett, wenn mich jemand aufklären könnte.
<br>
lg Dietmar
Comment