# Threads Auto-Produktion



## rorf (4. Apr 2011)

Also mir wurde eine Aufgabe gestellt...!

Ich bin nicht der beste Programmierer leider stehe ich dann noch heute auf der Leitung und komme nicht mehr runter. Sprich bei mir ist heute Stack Overflow im Kopf .(vll auch Underflow )

Naja nun zu meinen Problem!

Ich habe bei meinem Beispiel 1 Fabrik mit 2 Maschinen

-1 Maschine erzeugt Autos in den Farben rot,grün,blau und violet
-1 Maschine erzeugt Motorräder in den Farben rot, grün,blau und violet


Die produktion des Autos oder Motorrads dauert zw. 3 u 4 sekunden ... dies ist mir klar ich leg den thread einfach schlafen  mit dem sleep() befehl 
Die fertigen Autos und Motorräder kommen auf ein eigenes Laufband.
Die Fabrik hat einen Mitarbeiter der jeweils 1 Auto und 1 Motorrad zu einem Auto+Motorrad Paket zusammenpackt. Aber Auto/Motorrad müssen die selbe Farbe haben.

Ich brauche ein Mainframe dass aus folgenden sachen besteht dass hab ich aber schon

-jlist
-jStartBtn
-jStopBtn
-jCountText(eingabe der anzahl was hergestellt werden soll)

Die beiden Maschinen sowie der Verpacker werden jeweils durch einen eigenen Thread repräsentiert.
dabei wait() und notify() verwenden (wie???)
der Verpacker muss ja auf ein Auto einer bestimmten Farbe warten, wenn er schon eine Motorrad hat bzw. auf eine Motorrad einer bestimmten Farbe warten, wenn er schon ein Auto hat.
Für die Fließbänder brauche ich  jeweils eine ArrayList<String>: Wird ein rotes Auto erzeugt, wird einfach der String "rot" in die ArrayList für das Auto gestellt.

Sind genug Auto/Motorrad-Pakete erzeugt und verpackt worden, sollen die Maschinen gestoppt werden, d.h. die Threads werden beendet.
Achte darauf, welche Objekt an die jeweiligen Threads im Konstruktor übergeben werden müssen?????

Kann mir da jemand helfen zwecks code ?

Ich weis aufjedenfall brauch ich 3 threads
1x Auto
1x Motorrad
und 1x Thread für lesen aus den Arraylists der bei Autos wait aufruft und wartet bis ein Auto in Arraylist steht Dann wacht der Motorrad Thread auf weil  er das notify vom auto bekommt richtig ??
zwecks farben hätte ich mir einen switch überlegt... kann dass stimmen ???

Würde mich über rasche hilfe freuen euer panthe!


----------



## SlaterB (4. Apr 2011)

fange doch einfach an, nur ein Erzeuger, nur ein Verbraucher, wie man das im Lehrbuch lesen kann,
baue das langsam um auf Produkt Auto usw., GUI ist zunächst nicht erforderlich, 
bisher hast du keinen Code, quasi nichts als die Aufgabenstellung gepostet, daher auch nach Hausaufgaben verschoben


----------



## rorf (4. Apr 2011)

bzw GabelThread und MesserThread so ist es ersichtlicher...


```
package besteckfabrik;

import java.util.ArrayList;
import java.util.Random;

/**
 *
 * @author PaulE_1
 */
public class MesserThread extends Thread
{
    private ArrayList<String> messer;
    private String[] colors =
    {
        "rot", "grün", "blau", "gelb"
    };
    public MesserThread(ArrayList<String> messer)
    {
        this.messer = messer;
    }

    @Override
    public void run()
    {
        while (true)
        {
            if (Thread.interrupted())
            {
                break;
            }
            Random rnd = new Random();
            int index = rnd.nextInt(colors.length);
            String col = "";
            synchronized (messer)
            {
                switch (index)
                {
                    case 1: col = colors[index];
                        break;
                    case 2: col = colors[index];
                        break;
                    case 3: col = colors[index];
                        break;
                    case 4: col = colors[index];
                        break;
                    default:
                        return;
                }
                messer.add(col);
                messer.notify();
            }
            try
            {
                Thread.sleep(4000);
            } catch (InterruptedException exc)
            {
                interrupted();
            }
        }
    }


}
```


```
package besteckfabrik;

import java.util.ArrayList;
import java.util.Random;

/**
 *
 * @author PaulE_1
 */
public class GabelThread extends Thread
{
    private ArrayList<String> gabel;
    private String[] colors =
    {
        "rot", "grün", "blau", "gelb"
    };
    public GabelThread(ArrayList<String> gabel)
    {
        this.gabel = gabel;
    }

    @Override
    public void run()
    {
        while (true)
        {
            if (Thread.interrupted())
            {
                break;
            }
            Random rnd = new Random();
            int index = rnd.nextInt(colors.length);
            String col = "";
            synchronized (gabel)
            {
                switch (index)
                {
                    case 1: col = colors[index];
                        break;
                    case 2: col = colors[index];
                        break;
                    case 3: col = colors[index];
                        break;
                    case 4: col = colors[index];
                        break;
                    default:
                        return;
                }
                gabel.add(col);
                gabel.notify();
            }
            try
            {
                Thread.sleep(4000);
            } catch (InterruptedException exc)
            {
                interrupted();
            }
        }
    }


}
```


----------



## SlaterB (4. Apr 2011)

immerhin, da sowieso nur Farben erzeugt werden sind das fast schon Auto- + Motorrad-Thread,
aber niemand nutzt bisher die erzeugten Daten oder?
hast du dazu schon was?
arbeite Richtung eines Thread der aus dem Listen auch etwas herausnimmt usw., 

ich weiß, meine Tipps sind bisher mager, aber selber den Code programmieren und posten will ich eigentlich nicht gerade 

> dabei wait() und notify() verwenden (wie???)
ist das ein Aufgabentext? wurde dir nicht beigebracht was wait()/ notify() ist?
Galileo Computing :: Java ist auch eine Insel – 14.6 Synchronisation über Warten und Benachrichtigen
wenn du dazu technisch Fragen hast, ist das separat zu klären (ruhig in diesem Thread)

wie es einzusetzen ist ist eine eher philosophische Frage, z.B. könnte es ein Objekt klingel geben, 
der Verpacker wartet daran wenn er gerade sonst nix zu tun hat, die Fabriken klingeln, wenn sie ein Produkt fertig haben


----------



## rorf (4. Apr 2011)

Tut mir leid ich stehe auf der leitung... ein wenig mehr tipps und vll code wäre für mich heute leichter zu verstehen.... da ich wie gesagt auf der leitung stehe...


----------



## chalkbag (5. Apr 2011)

Moin,

ich denk SlaterB will das du dir ein paar Gedanken machst, deswegen von mir wohl auch nur ein paar wenige Informationen.

Die Aufgabe ist relativ umfangreich, so teil sie dir auf. Auch macht es Sinn dir das Klassen/Datenfluss - Modell erstmal mit Bleistift und Papier zu erarbeiten.

- Gui würd ich erstmal weglassen, die Logik kannst du auch erstmal gut mit der Konsole testen und anschließend dann die Gui an das entsprechende Interface hängen.
- Das Messer/Gabel zeigt dir ja schon zwei Beispiele für Erzeuger, d.h. Klassen die etwas herstellen und wenn sie damit fertig sind, per notify schlafende Verbraucher darüber informieren
- Schreib doch erstmal die zwei Erzeuger für Autos und Motorräder, die sind ja quasi 1zu1 wie Messer und Gabel (Farbe würde mein eigentlich als Enum auslagern, wenn du das kennst)
- Anschließend schreibst du das Fließband, den Datenspeicher, welcher sozusagen die erzeugten Produkte verwaltet
- Darauf gefolgt schreibst du den/die Verbrauer / Arbeiter, welcher versuchen z.b. ein rotes Moped und ein rotes Auto zu bekommen (siehe Standardbeispiel "speißende Philosophen"  mit Messer/Gabel)
- Zu guter letzt musst du die Synchronisation realisieren, also die Verbraucher schlafen (wait) legen, solange nicht gewünschte Produkte vorhanden und Erzeuger eben mit notify berücksichtigen

Am besten du ließt dir nochmal die Grundidee von dem Erzeuger/Verbraucher Problem durch, welches ihr in der Vorlesung behandelt habt. Wichtig ist noch, maximale Parallität, d.h. wenn ein Verbraucher /Arbeiter ein rotes Motorrad hat, aber noch kein rotes Auto so muss er nicht zwangsweise auf dieses warten, wenn ein blaues Moped und Auto schon fertig sind.

Grüße


----------

