1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

JavaThreads

  • Secretforce
  • 9. August 2009 um 23:32
  • Unerledigt
  • Secretforce
    3
    Secretforce
    Mitglied
    Punkte
    85
    Beiträge
    14
    • 9. August 2009 um 23:32
    • #1

    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

  • Secretforce
    3
    Secretforce
    Mitglied
    Punkte
    85
    Beiträge
    14
    • 9. August 2009 um 23:39
    • #2

    Könnte es so funktionieren :

    synchronize einlagern(){
    while(!lager){
    try{
    wait();
    }catch(InterruptException e){}
    }

    notifyAll();

    }

  • Secretforce
    3
    Secretforce
    Mitglied
    Punkte
    85
    Beiträge
    14
    • 10. August 2009 um 19:10
    • #3

    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;
    }

  • spinball
    11
    spinball
    Mitglied
    Reaktionen
    67
    Punkte
    1.192
    Beiträge
    223
    • 10. August 2009 um 20:05
    • #4

    [ 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)

  • Secretforce
    3
    Secretforce
    Mitglied
    Punkte
    85
    Beiträge
    14
    • 10. August 2009 um 20:21
    • #5

    Das hab ich doch so gemacht.

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 10. August 2009 um 20:26
    • #6

    Generell gilt außerdem: wo wait() verwendet wird, braucht man eine while-Schleife

  • Ringding
    11
    Ringding
    Mitglied
    Reaktionen
    12
    Punkte
    1.237
    Beiträge
    244
    • 10. August 2009 um 20:34
    • #7
    Zitat von Secretforce

    Ich komme nicht weiter habe mir viele sachen zu Threads durchgelsen

    Kann ich kaum glauben, aber bitte. Z.B. gibt's im Java Tutorial zu Threads diesen Abschnitt, der fast genau das macht, was du brauchst.

    http://java.sun.com/docs/books/tut…/guardmeth.html

  • Secretforce
    3
    Secretforce
    Mitglied
    Punkte
    85
    Beiträge
    14
    • 10. August 2009 um 20:37
    • #8

    Stimmt die while schleife hab ich vergessen.

  • Secretforce
    3
    Secretforce
    Mitglied
    Punkte
    85
    Beiträge
    14
    • 10. August 2009 um 20:38
    • #9

    Das selbe hab ich schon mal gelesen bring mich aber nicht weiter.

  • Secretforce
    3
    Secretforce
    Mitglied
    Punkte
    85
    Beiträge
    14
    • 16. August 2009 um 21:00
    • #10

    Vielen Dank für eure Hilfe ich hab das Problem aber schon gelöst.

    Liebe Grüße Stefan

  • spinball
    11
    spinball
    Mitglied
    Reaktionen
    67
    Punkte
    1.192
    Beiträge
    223
    • 16. August 2009 um 22:30
    • #11

    Bitte

  • spinball
    11
    spinball
    Mitglied
    Reaktionen
    67
    Punkte
    1.192
    Beiträge
    223
    • 16. August 2009 um 22:30
    • #12

    gern

  • spinball
    11
    spinball
    Mitglied
    Reaktionen
    67
    Punkte
    1.192
    Beiträge
    223
    • 16. August 2009 um 22:31
    • #13

    geschehen.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

Jetzt mitmachen!

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

Benutzerkonto erstellen Anmelden

Rechtliches

Impressum

Datenschutzerklärung