1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

JavaThreads

  • Secretforce
  • 9. August 2009 um 23:32
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • Secretforce
    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
    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
    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
    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
    Punkte
    85
    Beiträge
    14
    • 10. August 2009 um 20:21
    • #5

    Das hab ich doch so gemacht.

  • Ringding
    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
    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
    Punkte
    85
    Beiträge
    14
    • 10. August 2009 um 20:37
    • #8

    Stimmt die while schleife hab ich vergessen.

  • Secretforce
    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
    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
    Punkte
    1.192
    Beiträge
    223
    • 16. August 2009 um 22:30
    • #11

    Bitte

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

    gern

  • spinball
    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.

  1. Datenschutzerklärung
  2. Impressum