Thread Handling

Hab ein Problem mit der 'Kommunikation' zwischen zweier Threads. Der aufbau ist ungefähr so (Fast Pseudecode 😉). Die handle() Methode wird nur einmal aufgerufen während die fire() Methode öfters aufgerufen wird!

Java:
private final Object STICKER = new Object();

public void handle() {
  
  new Thread(() -> {
      while (true) {

      
      synchronized (STICKER) {
          // Do alot of Stuff
      }
      
    }
  }).start();
}

public void fire() {

  new Thread(() -> {
    
    synchronized (STICKER) {
      // Do Stuff
    }

  }).start();
}
Was ich möchte:
Handle läuft ja ununterbrochen, jetzt möchte ich das die fire Methode sozusage eine hohe Priorität hatt und den Thread in der Handle Methode pausiert bis der synchronized Block in der fire Methode durchgelaufen ist. Mit wait() und notify() habe ich nur ein bisschen gearbeitet und verstehe es leider irgendwie nicht 🙁

Kann mir einer vlt. zeigen / erklären wie ich dieses Problem löse, und / oder wie man mit notify() wait() genau arbeitet?

Danke schon mal im vorraus, LG. 🙂
 
Du könntest den grossen synchronized Block in deiner handle() Methode in viele kleine Blöcke aufteilen. Vielleicht kannst du auch die Menge an Code reduzieren, die synchronisiert werden muss.
 
Das ist bestimmt irgendwie möglich.
Aber du könntest den thread auch mit STICKER.wait() pausieren und dann mit STICKER.notify() weiterlaufen lassen. Dann musst du aber sicherstellen, dass notify() auch oft genug aufgerufen wird oder du verwendest wait(timeout) und übergibst als Parameter nur ein paar ms.
 
Sorry, hab aber keine Ahnung wo ich das STICKER.wait() und das STICKER.notify() hinpacken muss. Außerdem stellt sich mir da die frage, wird alles was synchronized (STICKER) pausiert? oder wie läuft das? 😳
 
Hier ist ein Beispiel, wie man das machen könnte.
Java:
public class SyncTest {
  private final Object STICKER = new Object();

  public void handle() {
    new Thread(() -> {
        while (true) {
        synchronized (STICKER) {
          for(int i = 0; i < 1000; i++) {
            System.out.println(i);
            try {
              STICKER.wait(10);
            } catch(Exception e) {
            }
          }
        }
      }
    }).start();
  }

  public void fire() {
    new Thread(() -> {
      synchronized (STICKER) {
        System.out.println("-----------------------");
      }
    }).start();
  }

  public static void main(String[] args) {
    SyncTest syncTest = new SyncTest();
    syncTest.handle();
    for(int i = 0; i < 100; i++) {
      try {
        Thread.sleep(100);
      } catch(Exception e) {
      }
      syncTest.fire();
    }
  }
}
 
Wenn das allerdings möglich ist, kann man in fast jedem Fall auch den sync-Block kleiner fassen, abgesehen von der (besonders in dem Beispiel deutlichen) Verlangsamung.


Hm, leider nicht möglich... aber einfach gefragt, wie kann ich den handle Thread stoppen, und wieder starten?
Was möchtest du denn damit erreichen?
Das, was du möchtest (Do Stuff soll Do alot of Stuff unterbrechen), klingt grad nach dem Gegenteil von dem, was du programmiert hast (Do alot of Stuff kann nicht von Do Stuff unterbrochen werden)
 
Erstmal danke für alle eure Guten und konstruktiven Antworten, habe das Problem letztendlich doch alleine gelöst, es stellte sich heraus dass es woaders lag.
Danke an alle trotzdem 🙂
 
Also ich (war) dabei einen eigenen ApplicationLayer zu schreiben (welcher nun fertig ist). Dabei entstand das problem dass ich ein Array immer kopiert habe, also mit einer for schleife, anstatt es (so wie es jetzt ist) in ein eine liste voller Arrays abzulegen.
Das kopieren hat über eine Sekunde gedauert was das Programm zu einigen Fehlern führte weswegen ich (fälschlicherweise) dachte ich könnte es lösen wenn ich den einen Thread warten lasse während der andere das Array Kopiert. War auch ein schlechter stiel.
 

Zurück
Oben