Probleme mit Threads

eagle1985

Mitglied
Hallo zusammen,

ich habe ein Problems mit Threads.

Ich würde gerne folgendes Problem beseitigen:

Es existieren zwei Threads, Thread A und der Main Thread

Code:
public class ThreadA extends Thread
{
  public void run()
  {
    while(true)
    {
      // Nix, damit Thread nicht abstirbt
    }
  }

  public void methode1()
  {
    // inhalt Methode 1
  }
}

nun instanziere ich den Thread aus dem Main-Thread heraus, erledigen andere Dinge und möchte zu einem späteren Zeitpunkt die Methode1 aus ThreadA in dessen Thread aufrufen.

Code:
...
ThreadA thread = new ThreadA();
thread.run(); // --> ergiebt Thread-Prozess A
... // erledigen andere dinge

thread.methode1();  // Dies sollte nun auch im Prozess-Thread A ablaufen

// klappt nicht
thread.interrupt();
thread.methode1;

hat jemand eine bessere Idee?
 
Du solltest auf jeden Fall den Thread mit ThreadA.start() aufrufen, sonst wird erst die run()-Methode ausgeführt und dann der restliche Code vom Main-Thread.

//Edit: Je nachdem, was du in der run()-Methode von ThreadA machst, kannst du in der Klasse ThreadA ein boolean definieren, das normalerweise false ist. Die run()-Methode sollte immer wieder diese Variable überprüfen, und wenn sie true ist soll sie die Methode1 aufrufen. Wenn der Main-Thread die Methode1 ausführen lassen will, kann er einfach diese Variable auf true setzen und die Methode1 wird ausgeführt.
 
Zuletzt bearbeitet:
sowas wie eine while(true) schleiffe mit boolean hab ich mir auch schon überlegt.

jedoch habe ich nicht nur eine methode1 sonder es gibt mehrere methoden welche aufgeruft werden könnten.

hab mir das schon so überlegt:

Code:
String methodName = null;
boolean continue = true;

public void setMethodName(String aName)
{
  methodName = aName;
}

public void stopThread(boolean aValue)
{
  continue = aValue;
}

public void run()
{
  while(continue)
  {
    if (methodName != null)
    {
      if (methodName.equals("method1")
      {
        method1();
      }
    }
  }
}

finde diese diese Variante nicht so toll und für Parameter müsste man zum commandName String noch ein Vector oder sowas erstellen wo man vorher noch die Parameter setzten müsste
 
Du kannst evtl. in Klasse ThreadA eine Instanz der Klasse Method erstellen, die normalerweise null ist, die aber vom Main-Thread mit dieser Methode zugewiesen wird. Oder du speicherst nur den Namen der Methode als String und suchst dann die Funktion in ThreadA mit der Methode aus dem Link.
Für die Parameter habe ich keine gute Lösung, du könntest nur bei allen Methoden von ThreadA die gleiche Anzahl an Parametern haben, die alle ein Object sind und die innerhalb dder Methode wieder als int etc. umgewandelt werden. Für diese Parameter hast du ein Object-Array, wo sie vom Main-Thread gespeichert werden.
Du musst dann aber sofort nach der Überprüfung durch ThreadA den Wert wieder auf null setzen, damit die Méthode nicht zweimal aufgerufen wird.
 
Habs jetzt mal temporär so gelösst, dass ich dem Thread eine Methode gesetzt habe setMethod(IMethode aMethod)

dieser setzte der Varable des Typs IMethod (definiertes Interface) worauf der Thread im Run immer prüft ob die Variable ungleich null ist.
falls != null wird die doMethode methode aus dem Interface aufruft.
Heisst ich muss für alle gewollten Aktionen eine eigene Klasse schreiben welche das Interface Implementiert und dadurch abgearbeitet werden kann.
Wegen den Parametern habe ich einfach mal einen Object[] definiert. Da alle in Aktionen in einer eigenen Klasse ablaufen, besteht auch kein Problem wegen den Parametermenge, da jede Klasse ja weiss was für Paramter sie erwartet.
Aber bin irgendwie nicht so glücklich mit dieser Methode.

Die Threads brauche ich da ich im Programm zwei JFrames gleichzeitig laufen habe. Das einte Frame benötigt jedoch DLL und lädt diese mit Hilfe von JNI.
Die Objekte von JNI sind nur im Thread gültig wo sie erstellt werden. Falls jetzt aus dem Anderen Frame (jedes Frame läuft in einem eigenen AWT-Event-Thread) eine Meldung zur Darstellungsänderung kommt und die JNI-Objekte genutzt werden, wird immer ein Fehler geworfen, dass diese nicht in dem Thread Initialisiert wurden.
Daher habe ich gedacht, dass ich alle Aufgaben welche JNI betreffen in einen eigenen Thread auslagere und alle Aktionen immer in diesem Thread laufen lasse.
Dadurch kann ich sicherstellen, dass alles immer im gleicen Thrad abläuft.

besten Dank soweit mal für eure wertvolle Hilfe
 
hab noch ne kleine allgemeine Frage zu Threads.

ich habe folgende Methdoe in der Thread klasse welche aus anderen Threads aufgerufen werden kann damit eine Aktion.
Diese methode sollte immer nur von einem Thread genutzt werden können und die anderen müssen warten.

Wenn ich nun die Methode synchronized setzte kann ja nur ein Thread darauf zugreifen. Wenn jetzt ein parallel Thread kommt und darauf zugreiffen möchte, sollte dieser ja warten bis die Methode wieder frei ist. Muss ich diese Threads irgendwie informieren oder handelt das Java selbstständig?

Hier noch mein Code:

Code:
   private InterfaceMethods = null;

    public void run()
   {
      runThread = true;
      while(runThread)
      {
         if (method != null)
         {
            method.doTask();
            method = null;
            System.gc();
         }
      }
   }
  
   
   public synchronized void setMethod(InterfaceMethods aMethod)
   {
      while (method != null)
      {
         // warten bis parallel-Prozess fertig ist
      }
      method = aMethod;
   }
 
Nein, es kann nur eine syncronized Methode pro Instanz ausgeführt werden. Sonst schau dir mal ReentrantLock an.
 
Wenn das Problem nur das ist, dass zwei JFrames miteinander kommunizieren können, warum verwendest du dann nicht Events? Das eine Frame sendet ein Aktions-typisches Event an das andere Frame, und sendet die notwendigen Parameter gleich mit. Die Event-Klassen musst du natürlich selber implementieren, aber dafür hast du dann auch passend typisierte Übergabedaten zur Verfügung.
 
Zurück