Mehrere Threads in einer Klasse verwalten



  • Hallo. Also, wie kann ich mehrere Threads in einer Klasse verwalten?

    Also normaler Weise braucht ja jeder Thread eine run(), aber wie mache ich das wenn ich jetzt in einer Klasse mehrere Threads habe, die sich alle unterschiedlich verhalten sollen?



  • *push*

    Ich will ja noch ´ne Antwort....



  • Wie meinst das jetzt? Verschiedene Threads durch eine Klasse dargestellt? Eine Klasse launcht mehrere Threads? Oder wie nun?



  • Dreist...nach 2 Stunden schon pushen.



  • @ TriPhoenix

    Ja so, aber sie soll sie soll auch alle unterschiedlichen Verhaltensweisen beinhalten. Also mal ein Bsp. was wohl nicht klappen wird:

    class SevThr implements Runnable {

    Thread t1;
    Thread t2;
    Thread t3;

    public SevThr() {
    t1 = new Thread(this);
    t2 = new Thread(this);
    t3 = new Thread(this);
    }

    public void run() { // irgendwie für t1
    }

    public void run() { //für t2
    }

    public void run() { //für t3
    }

    Also so, dass sich alle unterschiedl verhalten. Nun weis ich ja dass das da oben nicht wirklich klappt, also wie kann ich das nun realissieren?

    @ Gerhard

    Ich hatte es nunmal eilig, habe zwar keine Antwort mehr bekommen, jedenfalls net heut früh, aber ich bin sicher heute wird´s was! 😃



  • Okay, dann machst du folgendes:

    Deine Klasse kriegt einen Konstruktor mit sagen wir einem Integer als Parameter.
    Dazu legst du dir am besten noch 3 integer-Konstanten an die das Verhalten bestimmen, also im Groben so:

    public class Foo {
       // die Konstanten natrülich vernünftig bennnen
       public static final int VERHALTEN1 = 1;
       public static final int VERHALTEN2 = 2;
       public static final int VERHALTEN3 = 3;
    
       // verhalten hält das verhalten für diese Instanz
       private int verhalten;
    
       // Konstruktor erstellt eine neue Instanz mit gegebenem Verhalten
       public Foo(int verhalten) {
          this.verhalten = verhalten;
       }
    
       // zentrale run-Methode, leitet weiter an die Untermethoden
       public void run() {
          switch (verhalten)
             case VERHALTEN1:
                 run1();
                 break();
             case VERHALTEN2:
                 run2();
                 break();
             case VERHALTEN3:
                 run3();
                 break();
       }
    
       public void run1() {
          // hier thread 1
       }
    
       public void run2() {
          // hier thread 2
       }
    
       public void run3() {
          // hier thread 3
       }
    }
    

    So kannst du dir 3 Instanzen der Klasse anlegen, die sich alle verschieden verhalten. Schöner ists aber imho einzelne Klassen anzulegen. Falls die auf gemeinsame Daten zugreifen müssen erstellst du halt noch eine Datenhaltungsklasse auf die die 3 verschiedenen Threads dann zugreifen können.



  • Danke! 🙂

    Ich weis dass das mit mehreren Klassen schöner ist, auch meiner Meinung nach.
    Nur bei ist es so, dass ich keinen Zugriff auf die Hauptklasse, die alles steuert kriege. Streng verboten! 😉



  • [EDIT]

    Also danke für die Antwort, aber mr fällt gerade ein das mich das nicht weiterbringt. Denn alle Aktionen sollten möglichst, wie es normaler Weise auch gehen würde, gleichzeitig ablaufen. Und wenn ich das so mache, klappt das leider nicht, oder? Mhh, gibt es da irgendeine Lösung? Denn leider kann ich wirklich keinen Zeiger auf die Hauptklasse kriegen, da das wie gesagt "verboten" ist.



  • Original erstellt von <Pogo>:
    [EDIT]
    Also danke für die Antwort, aber mr fällt gerade ein das mich das nicht weiterbringt. Denn alle Aktionen sollten möglichst, wie es normaler Weise auch gehen würde, gleichzeitig ablaufen.[/QB

    **
    Inwiefern tun sie das bei meinem Konzept nicht? 🙂

    [QB]
    Und wenn ich das so mache, klappt das leider nicht, oder? Mhh, gibt es da irgendeine Lösung? Denn leider kann ich wirklich keinen Zeiger auf die Hauptklasse kriegen, da das wie gesagt "verboten" ist.

    **
    Du könntest auch noch inner classes verwenden. Also die obige Thread-Klasse INNERHALB deiner Hauptklasse deklarieren. Dann hat die innere Klasse Zugriff auf alles in der Hauptklasse.

    public class Hauptklasse {
       // hier der Hauptklassencode
    
       private class ThreadUnterklasse implements Runnable {
          // hier die Threadklasse
       }
    }
    

    PS: Warum sind Huaptklassenreferenzen so verboten 😕



  • Hey Danke! Ich werde das mal bei Gelegenheit ausbropieren.

    Also, zum Verbot:

    Ich habe keine Ahnung! 😃
    http://apps.alphaworks.ibm.com/rumble/

    Also, ich will da auch mal was programmieren. Und das die Hauptklasse eben nicht referenziert werden darf, ist eben die Schuld von olle Nelson*.
    Keine Ahnung warum der das so wollte...

    *Nelson: Programmierer von Robocode



  • Mhh, ich glaube das mit den Threads hat sich erledigt. Als ich das endlich geschafft habe, hat es das komplette Programm komischer Weise extrem ausgebremst. Ich habe keine Ahnung warum, ich werde wohl eine andere, für dieses ja spezielle Gebiet, finden können und auch müssen. 🙂


Anmelden zum Antworten