Hallo,
momentan experimentiere ich mit Threads und habe mir das unten stehende Beispielprogramm KonsumentProduzent angeschaut.
Eigentlich sollte ein Konsument (siehe Ausgabe) kein Produkt (modelliert durch einen Integer Wert) verbrauchen koennen, wenn es noch nicht produziert wurde aber laut Ausgabe geschieht genau dies (3 konsumiert, bevor es konsumiert wurde)!
Wo liegt also der Fehler???
Hier die Ausgabe des Programms:
Danke!
momentan experimentiere ich mit Threads und habe mir das unten stehende Beispielprogramm KonsumentProduzent angeschaut.
Eigentlich sollte ein Konsument (siehe Ausgabe) kein Produkt (modelliert durch einen Integer Wert) verbrauchen koennen, wenn es noch nicht produziert wurde aber laut Ausgabe geschieht genau dies (3 konsumiert, bevor es konsumiert wurde)!
Wo liegt also der Fehler???
Code:
public class KonsumentProduzent {
public static void main(String[] args) {
Produkt c = new Produkt(); //Neue Produktklasse erstellen
(new Produzent(c)).start(); //Instanz eines Produzenten-Threats
(new Verbraucher(c)).start(); //Instanz eines Konsumenten-Threats
}
}
class Produkt{
private int dasProdukt; //Ein Metaprodukt modelliert ueber einen Integerwert
private boolean verfügbar = false; //Variable, die anzeigt, ob ein Produkt zum Verbrauch vorhanden ist
public synchronized int verbraucht() { //Methode, welche ein Produkt verbaucht, falls es forhanden ist
while (verfügbar == false) {
try {
wait();
}
catch (InterruptedException e) { }
}
verfügbar = false; //Produkt wurde verbaucht
notify(); //jetzt kann Produziert werden
return dasProdukt;
}
public synchronized void produziert(int produktWert) { //Methode, die ein neues Produkt erzeugen soll
while (verfügbar == true) {
try {
wait();
}
catch (InterruptedException e) { }
}
dasProdukt = produktWert; //Neues Produkt erstellen
notify(); //Jetzt kann verbaucht werden
verfügbar = true;
}
}
class Produzent extends Thread {
private Produkt einProdukt;
Produzent(Produkt c) { einProdukt = c; }
public void run() { //Start der Produktionsphase
for (int i=0; i<10; i++) {
einProdukt.produziert(i); //Es werden 10 Artikel produziert
System.out.println(i + " produziert");
}
}
}
class Verbraucher extends Thread {
private Produkt einProdukt;
Verbraucher(Produkt c) { einProdukt = c; }
public void run() {
for (int i=0; i<10; i++) { //Produzierte Artikel werden verbraucht
System.out.println(einProdukt.verbraucht() + " konsumiert");
}
}
}
Hier die Ausgabe des Programms:
0 produziert
1 produziert
0 konsumiert
2 produziert
1 konsumiert
2 konsumiert
3 konsumiert
3 produziert
4 konsumiert
4 produziert
5 produziert
6 produziert
5 konsumiert
7 produziert
6 konsumiert
7 konsumiert
8 konsumiert
8 produziert
9 konsumiert
9 produziert
Danke!