Threads: Runnable object ansprechen



  • Hi zusammen,

    eine grundsätzliche Frage zu den Threads in Java.
    Ich habe ca. diesen Aufbau:

    Thread t[] = new Thread[10];
    for( int i = 0; i < t.length; i++ )
    {
       myRunnable run = new myRunnable(); // implements Runnable
       t[i] = new Thread(run);
       t[i].start();
    }
    

    Gut, nun habe ich also ein Array mit 10 Threads, die 10 verschiedene Objekte der Klasse "myRunnable" als target haben. Nun möchte ich später im Code eine Methode der Objekte von "myRunnable" zugreifen. Ich kann zwar durch das Array der Threads loopen, wie kann ich dann aber in der Schleife auf diese Methode des "myRunnable" Objekt zugreifen?

    Es scheint als gäbe es keine Methode, um auf das private Attribute "target" der Klasse "Thread" zuzugreifen. Muss ich in meinem Fall also wirklich ein die Klasse "Thread" anstatt des Interface "Runnable" verwenden? Oder muss ich mir zusätzlich zum Thread Array auch noch ein weiteres Array für die Runnable Objekte anlegen?

    Danke für jede Hilfe!
    Grüsse, Matthias



  • Du könntest auch, wenn es geht, auch myRunnable von Thread ableiten.



  • Hi, daran habe ich auch schon gedacht. Allerdings wird in 90% aller Tutorials geraten, die Klasse mit dem Runnable Interface zu implementieren, anstatt sie direkt von Thread abzuleiten.

    Wie ist das zu deuten?



  • Wieso speicherst du die Runnables nicht in das Array?



  • Das mache ich zurzeit, aber ich finde die Lösung nicht sehr elegant. Weil dann habe ich ja zwei Arrays für die Thread-Verwaltung: Eines für die Thread-Objekte, und ein zweites für die Runnable-Objekte 😞



  • Dann musst du dir eine eigene Klasse schreiben, die den Thread und das Runnable kapselt. Das wäre aus OO-Gesichtspunkten am besten.



  • haimat schrieb:

    Das mache ich zurzeit, aber ich finde die Lösung nicht sehr elegant. Weil dann habe ich ja zwei Arrays für die Thread-Verwaltung: Eines für die Thread-Objekte, und ein zweites für die Runnable-Objekte 😞

    Wieso speicherst du ueberhaupt die Thread-Objekte? Nachdem du den Thread mit Thread#start gestartet hast, brauchst du das Thread-Objekt nicht mehr, nur noch das Runnable. (es seih den du willst dynamisch die Prioritaeten aendern).



  • manchmal braucht man die thread objekte. z.b. wenn man warten möchte, bis ein thread beendet wurde o.ä.
    ich lös sowas meist ungefähr so:

    class ThreadContext
    {
      private MyRunnable runnable;
      private Thread thread;
    
      public ThreadContext(MyRunnable runnable)
      {
         this.runnable = runnable;
      }
    
      public void start()
      {
        thread = new Thread( runnable );
        thread.start();
      }
    
      public void stop()
      {
        runnable.stop();
        thread.join();
      }
    }
    


  • Hi thordk_,

    vielen Dank für deine Bsp. Klasse.
    Ich schätze genau sowas brauche ich 💡

    Gruss und ein schönes WE noch, Matthias


Anmelden zum Antworten