Thread Hilfe

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Thread Hilfe

    Hi,ich moechte gern das Producer/Consumer Problem-Beispiel etwas ab aendern.
    Link zum Beispiel
    kbs.uni-hannover.de/Lehre/Info…/java/thread/thread-5.htm ist auf

    Die klasse CubbyHole soll ein Array haben mit 2 verschiedenen Werten .Ein String und ein Integer.Der String Soll immer fest sein und der Integer soll sich aendern.
    Das array soll 4 Strings und 4 Integer haben.

    Die Producer class soll mit einem Thread dieses array mit Zufallszahlen fuellen.Aslo nur den Integer.Der String bleibt fest.

    Die class Consumer soll einen Thread haben der auch auf das array zugreift und die Werte also die Integer abzieht.

    Danach kommt noch die Testclass wo ich dann 2 threads gleichzeitig zum abziehen schike und falls das array leer ist soll dan der thread producer es wieder fuellen.

    Hat einer eine Idee wie ich das am besten jezt mit java realisiere.

    Problem 1.wie kriege ich einen String und ein Integer in ein Array-List.Wie sag ich dann den Threads sie sollen dazugreifen.
    Danke fuer jede Hilfe
  • Du solltest zunächst mal zwischen einem Array

    Quellcode

    1. new Integer[5];

    und einer List wie z.B. ArrayList

    Quellcode

    1. new ArrayList<Integer>();

    unterscheiden.

    Wenn du Integer und String in einer Liste haben willst, muss die Liste vom gemeinsamen Obertypen sein. Das wäre dann Object. Du wirst aber keine Liste von Objects anlegen, da ja alles mögliche ein Object ist und du ja weißt, dass man die Typsicherheit von Java nicht aushebeln sollte. Welche Funktion soll denn der String haben? Ist es vielleicht sogar ein Schlüssel dem du den entsprechenden Integer zuordnen willst? Dann bist du bei Listen falsch und solltest dir mal die Map (z.B. HashMap) anschauen.

    Quellcode

    1. new HashMap<String, Integer>();


    Beachte bei paralleler Programmierung, dass nicht zwei Threads gleichzeitig etwas an deiner Collection machen. Deswegen musst du sicherlich das Schlüsselwort synchronized bei einer deiner Methoden verwenden. Das sorgt dafür, dass die Methode immer nur von einem Thread "betreten" werden kann.
  • Hallo Hafner , danke fuer deine Antwort.Ich versuche es jezt mit HashMap.

    Meinst du die Producer class soll eine seperate Class sein oder soll ich direkt in CubbyHole einen Thread stecken der die HahMap mit neuen integern fuellt.Ich weiss nicht was korrekt von der Logik ist.
    Die HashMap soll ja nur gefuellt werden wenn Sie vom Consumer entleert ist.In dem fall sollte die Sleep methode eingreifen den Consumer zum schlafen bringen und Producer soll fuellen.

    Danke
  • Es gibt eine put()-Methode. Der musst du einen Schlüssel und einen Wert übergeben. Bedenke, dass jeder Schlüssel einmalig sein muss.

    Quellcode

    1. Map<String, Integer> exampleMap = new HashMap<String, Integer>();
    2. exampleMap.put("A", 1);
    3. exampleMap.put("B", 2);
    4. System.out.println(exampleMap.get("A")); // gibt 1 aus
    5. System.out.println(exampleMap.get("B")); // gibt 2 aus
    6. exampleMap.put("A", 3);
    7. System.out.println(exampleMap.get("A")); // gibt 3 aus
    8. System.out.println(exampleMap.get("B")); // gibt 2 aus
    9. exampleMap.put("A", exampleMap.get("A") + exampleMap.get("B"));
    10. System.out.println(exampleMap.get("A")); // gibt 5 aus
    11. System.out.println(exampleMap.get("B")); // gibt 2 aus
    Alles anzeigen