Will umgekehrt der Hersteller Waren entnehmen, blockiert er das Lager, wenn er an der Reihe ist. Sind genügend viele Einzelteile im Lager, entnimmt er diese, der Lagerverwalter stellt den Lieferschein aus, aktualisiert den Lagerbestand, und der Hersteller gibt das Lager wieder frei. Fehlt aber mindestens eines der benötigten Teile im Lager, muss der Hersteller das Lager wieder freigeben er ruft seinerseits die Methode wait() auf.
Nun reiht sich auch dieser Thread in die Warteschlange ein und wartet darauf, dass er durch den Aufruf von notify() eines Lieferanten informiert wird, wenn sich der Lagerbestand geändert hat. Falls das Java-Laufzeitsystem ihn wieder in das Lager lässt, versucht der Hersteller erneut, seine Waren zu entnehmen.
public synchronized void entnehmen(String Produkt) //4 Reifen, 4 Felgen und 2 Achsen entnehmen, //falls vorhanden { while((bestand[0]<4) | (bestand[1]<4) | (bestand[2]<2)) { try { wait(); } catch (InterruptedException e) { } } ... notify(); } }
In der Klasse Lager sind also folgende Änderungen vorzunehmen:
Dieses Verfahren, freiwillig die Zuteilung der Rechneraktivität freizugeben und sich darauf zu verlassen, dass ihn ein anderer Thread darüber informiert, wenn sich der Inhalt der kritischen Daten ändert, wurde von Tony Hoare unter dem Namen Monitor-Konzept eingeführt. Wichtig bei diesem Verfahren ist, dass jeder Thread, der die kritischen Daten ändert, eine der Methoden notify() oder notifyAll() aufruft.
Vollständige Version von Lager.java
© Ralph-Erich Hildebrandt, 27. September 2004