• Ein wunder schönen guten Abend wünsche ich.

    Ich komme nicht weiter habe mir viele sachen zu Threads durchgelsen aber er gelingt mir nicht diese Aufgabe zu lösen.

    Wenn ich die Klassen hier habe :

    class Lager {
    private int bestand;
    private static final int kapazität = 20;
    public void einlagern() {
    if (bestand+5 <= kapazität) {
    bestand+=5;
    System.out.println("nach einlagern :" + bestand);
    }
    }
    public void entnehmen() {
    if (bestand-3 >= 0) {
    bestand-=3;
    System.out.println("nach entnehmen :" + bestand);
    }
    }
    }


    //Ein ProduzentThread-Objekt versucht in einer Endlosschleife jeweils //Waren einzulagern.
    class ProduzentThread extends Thread {
    private Lager lager;
    ProduzentThread(Lager lager) {
    this.lager = lager;
    }
    public void run() {
    while(true){
    lager.einlagern();
    }
    }
    }
    //Analog dazu versucht ein KonsumentThread-Objekt in einer Endlosschleife jeweils Waren aus dem Lagerbestand um zu entnehmen. Der Quelltext ist analog zum Produzenten gestaltet. In der While-Schleife wird hier die Methode lager.entnehmen()aufgerufen.

    In einer Main-Methode wird jeweils ein Objekt der Klasse Lager, ProduzentThread und KonsumentThread angelegt (vgl. Skizze). Anschließend wird erst pt.start() und dann kt.start() aufgerufen.

    Jetzt soll:

    Mit den Methoden wait() und notifyAll(), um sicherzustellen, dass der ProduzentThread wartet, bis im Lager wieder genügend freie Kapazität für eine neue Lieferung vorhanden ist und dass, der KonsumentThread wartet, bis das Lager mindestens einen Bestand von 3 hat, bevor er etwas aus dem Lager entnimmt. Es sollen auch die veränderten Methoden einlagern() und entnehmen() der Klasse Lager an gegeben werden.

    Ich weiß nicht weiter bitte um Hilfe.

    Liebe Grüße Stefan

  • Ich habe es noch mal anders gemacht. Weiß aber nicht ob das so richtig ist.

    public synchronized void put(int bestand) {
    if (!empty)
    try {
    wait();
    }
    catch(InterruptedException e) {}
    System.out.println("Einlagern: "+bestand);
    buffer = bestand;
    empty = false;
    notify();
    }

    public synchronized int get() {
    if (empty)
    try {
    wait();
    }
    catch(InterruptedException e) {}
    System.out.println("Entnehmen: "+buffer);
    empty = true;
    notify();
    return buffer;
    }

  • [ CODE ] + EDIT + OOP-Skriptum ab Seite 142

    Generell gilt:

    Code
    sync einlagern(int wieviel) {
        1. auf überlauf prüfen
        2. einlagern
        3. notify an andere threads
    }
    sync entnehmen(int wieviel) {
        1. auf unterlauf prüfen
        2. entnehmen
        3. notify an andere threads
    }

    Wie du siehst, sind beide Methoden ähnlich. Ich empfehle sie zu einer einzigen Methode zu kombinieren und als Parameter auch negative Zahlen zuzulassen:

    Code
    sync veraendern(int wieviel) {
        1. auf überlauf/unterlauf prüfen
        2. einlagern/entnehmen
        3. notify an andere threads
    }

    Einmal editiert, zuletzt von spinball (11. August 2009 um 00:15)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!