Richtiges Warten

eclipseworker

Bekanntes Mitglied
Ich habe folgenden Code um ein wichtiges Verhalten zu simulieren: verzögerter Erzeuger aufgerufen im Main:
Java:
public class MainClass {
 
  public static class Waiter implements Runnable{
      private int ses=0;
      public void run(){
        try{
          new Thread().sleep(500);
        }catch(InterruptedException i){
          i.printStackTrace();
        }
          ses=1;
          notifyAll();
      }
     
      public int getSes(){
          return ses; 
      }
  }
    public static void main(String[] args) {
      try{
          Waiter w=new Waiter();
          Thread wt=new Thread(w);
         // Object o=new Object();
          wt.start();
          synchronized (wt){
          wt.wait();}
          System.out.println(w.getSes());
      }catch(InterruptedException i){
          i.printStackTrace();
 
      }
    }
}
nun der code gibt wie erwartet 1 aus, aber hat auch eine IllegalMonitorStateException wie komme ich da herum? Außerdem ich habe mehrere Threads die sich einen Waiter erzeugen und auf das Result ihres eigenen Waiters warten, wie stelle ich sich, dass ein Threat der von einem anderen Waiter aufgeweckt wurde weiter schläft? Ich habe schon überlegt eine Boolsche Variable zusetzen, aber das scheint mir zu unsicher.
 

eclipseworker

Bekanntes Mitglied
Gib dem Waiter doch ein Interface und rufe dort dann waiterHasFinished() oder sowas auf.

Gruß

Claus
Eigentlich wollte ich Bussywaiting vermeiden und das an Java delegieren.
Ich meine ja
Java:
public interface Waitinterface{
    public boolean isFinished();
}
und dann
in der Main Klasse:
Java:
Waiter w=new Waiter();
Thread wt=new Thread(wt);
wt.start();
while(!w.isFinnished());
System.out.println(w.getSes());
//arbeite weiter
wäre ein Lösung, ich suche aber ein etwas bessere.
 
Zuletzt bearbeitet:

mrBrown

Super-Moderator
Mitarbeiter
nun der code gibt wie erwartet 1 aus, aber hat auch eine IllegalMonitorStateException wie komme ich da herum?
Indem du die Doku der aufgerufenen Funktionen beachtest, weshalb die Exception geschmissen wird, steht dort beschrieben ;)

https://docs.oracle.com/javase/10/docs/api/java/lang/Object.html#notifyAll() hat gesagt.:
IllegalMonitorStateException - if the current thread is not the owner of this object's monitor.



Ich meine ja
Java:
public interface Waitinterface{
    public boolean isFinished();
}
und dann
in der Main Klasse:
Java:
Waiter w=new Waiter();
Thread wt=new Thread(wt);
wt.start();
while(!w.isFinnished());
System.out.println(w.getSes());
//arbeite weiter
wäre ein Lösung, ich suche aber ein etwas bessere.
Mit der Variante stößt du u.U. auf weitere Probleme. Beide beteiligten Threads können je nach Umsetzung die finished-Variable cachen, und bekommen von Änderungen des andere Threads nichts mit, wodurch das eine Endlosschleife produziert.

Falls du aber Spin-Locks nutzen willst, kannst du der JVM helfen, und Thread.onSpinWait nutzen.

Eigentlich wollte ich Bussywaiting vermeiden und das an Java delegieren.
In java.util.concurrent gibts einen Haufen Klassen, die die low-level-Dinge kapseln und das für den Entwickler vernünftig nutzbar machen. Für die meisten Fälle gibts da was passendes - in deinem Fall könnte schon ExcecutorService reichen ;)
 
Zuletzt bearbeitet:

Thallius

Top Contributor
Eigentlich wollte ich Bussywaiting vermeiden und das an Java delegieren.
Ich meine ja
Java:
public interface Waitinterface{
    public boolean isFinished();
}
und dann
in der Main Klasse:
Java:
Waiter w=new Waiter();
Thread wt=new Thread(wt);
wt.start();
while(!w.isFinnished());
System.out.println(w.getSes());
//arbeite weiter
wäre ein Lösung, ich suche aber ein etwas bessere.

Sorry mein Fehler. Ich meinte natürlich einen Listener und kein Interface.
 

eclipseworker

Bekanntes Mitglied
Indem du die Doku der aufgerufenen Funktionen beachtest, weshalb die Exception geschmissen wird, steht dort beschrieben ;)
Ok danke, dass ändert aber nicht an meinen Problem, dass ich in der Mainklasse warten muss da dort das Erzeugnis gebraucht wird. Und Executor Service ist auch eher unangebracht, da ich eher das Programm 10 mal oder so sperat starte.
Ok vielleicht beginne ich von vorne:
ich soll ein Peer-Netzwerk simulieren und der relevante Code in der Node ist folgender:
Java:
Socket newConnection=serverSocket.accept();
                  String connectionAddress=newConnection.getInetAddress().getHostAddress();
                  int connectionPort=newConnection.getPort();
                  LineAdded addStat=table.addnewLine(new NodeTableLine(connectionAddress, connectionPort, "tempmname"+tnc), increase, replaceLine);
                  NodeAnswerMaschine ans=new NodeAnswerMaschine(newConnection, table);
                  Thread ansThread=new Thread(ans);
                  ansThread.start();
                  ansThread.wait();
                  NodeTable tableAnsweredWith=ans.getRecived();
                  table.merge(tableAnsweredWith, false);
also kurz wird eine Verbindung aufgebaut ist diese von einem anderen Knoten, er schickt mir seinen NoteTable und ich und ich ihm seinen, nun richtig wäre es ein Knoten pro Gerät, ich habe aber nur ein Gerät und muss es auf dem machen.
Und so sende ich die Table (etwas unterhalb diesem Empfangscode):
Java:
Thread.sleep(sleep);
                  NodeTableLine rl=table.returnRandomLine();
                  String rlAddress;
                  int rlPort;
                  if(rl.getConcetedVia().equals(NodeTableLine.direct)){
                      rlAddress=rl.getAddress();
                      rlPort=rl.getPort();
                  }else{
                      rlAddress=rl.getConcetedVia().split(":")[0];
                      rlPort=Integer.getInteger(rl.getConcetedVia().split(":")[1]);
                  }
                  try(Socket socket = new Socket(rlAddress, rlPort);
                    ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());){
                        out.writeObject(table);
                        out.flush();
                        socket.close();
                      }catch (IOException e) {
 

mrBrown

Super-Moderator
Mitarbeiter
Ok danke, dass ändert aber nicht an meinen Problem, dass ich in der Mainklasse warten muss da dort das Erzeugnis gebraucht wird.
Inwiefern ist das ein Problem? Oben steht ein völlig anderes...
Und Executor Service ist auch eher unangebracht, da ich eher das Programm 10 mal oder so sperat starte.
Für das oben beschrieben ist das durchaus eine mögliche Lösung...

Wenn du das *Programm* allerdings separat startest, hat das nicht mehr viel mit Threads zu tun, sondern du musst verschiedene Prozesse synchronisieren, das ist eine völlig andere Baustelle.


Thread ansThread=new Thread(ans);
ansThread.start();
ansThread.wait();
Dieses Pattern (Ausführung asynchron starten, auf Ende warten, Ergebnis abholen) ist einer der Anwendungsfälle, der ziemlich gut für ExcecutorService in Verbindung mit Callable und Future geeignet ist.
Warum sollte das nicht gehen?


Warum das bei deinem Problem völlig ungeeignet ist, versteh ich anhand deiner Erklärung nicht...
 

mrBrown

Super-Moderator
Mitarbeiter
Das Programm sollte auch über ein richtiges Netzwerk funktionieren, also würde ein Executehandler mit einem Task gestartet.
Und...?

nd wie das Callable es besser macht erschließt sich mir nicht.

Dein obiges Programm wird damit zu einem:
Code:
public class MainClass {
 
public static void main(String[] args) throws Exception {
        WaiterTask w = new WaiterTask();
        ExecutorService executor = Executors.newSingleThreadExecutor();
        Future<Integer> ses = executor.submit(w);
        System.out.println(ses.get());
    }

    public static class WaiterTask implements Callable<Integer> {
        @Override
        public Integer call() throws Exception {
            Thread.sleep(500);
            return 1;
        }
    }
}

Ganz ohne irgendwelche händische Synchronisierung
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Datentypen Richtiges Format abspeichern Java Basics - Anfänger-Themen 13
A richtiges deklarieren ArrayList Java Basics - Anfänger-Themen 5
W nicht richtiges Ergebnis /Kreditberechnung Java Basics - Anfänger-Themen 5
T Methoden Testen und schaun ob richtiges Ergebnis? Java Basics - Anfänger-Themen 5
M Klassen und Objekte => richtiges Verständnis? Java Basics - Anfänger-Themen 6
B Datumsstring umwandeln in richtiges dd.mm.yyyy format? Java Basics - Anfänger-Themen 2
M Richtiges einbinden der reload() funktion. Java Basics - Anfänger-Themen 2
S log4j "Richtiges" Design Java Basics - Anfänger-Themen 4
H JavaFX Hintergrundfarbe ändern, warten, Hintergrundfarbe wieder ändern Java Basics - Anfänger-Themen 34
D Programm auf Enter warten lassen Java Basics - Anfänger-Themen 2
S in ActionListener auf Eingabe aus anderem Frame warten Java Basics - Anfänger-Themen 2
G Wie kann ich 1s lang warten? Java Basics - Anfänger-Themen 1
D JFrame - 10 Sekunden bis zum schließen warten. Java Basics - Anfänger-Themen 2
R Threads aufeinander warten lassen? Java Basics - Anfänger-Themen 10
S Input/Output In Java Swing auf Button warten? Java Basics - Anfänger-Themen 9
A Thread auf anderen warten Java Basics - Anfänger-Themen 2
C Warten auf Antwort Java Basics - Anfänger-Themen 22
S Threads Programm terminiert statt zu warten Java Basics - Anfänger-Themen 20
E ExecutorService warten bis alles fertig? Java Basics - Anfänger-Themen 5
A Threads Eine Klasse muss auf Variable der Anderen warten. Java Basics - Anfänger-Themen 6
D Input/Output Auf Tasteneingabe warten Java Basics - Anfänger-Themen 4
A Activity1 soll auf Activity2 warten (Camera-Intent) Java Basics - Anfänger-Themen 5
D Threads Kartenspiel - auf legen warten Java Basics - Anfänger-Themen 15
B Methode warten lassen bis Button gedrückt wird Java Basics - Anfänger-Themen 16
JAVAnnik auf Threadende warten Java Basics - Anfänger-Themen 6
H Auf Threads warten Java Basics - Anfänger-Themen 3
S Warten bis alle Threads fertig sind Java Basics - Anfänger-Themen 12
I Auf DB-Operation warten Java Basics - Anfänger-Themen 2
R Thread soll auf andere Threads warten Java Basics - Anfänger-Themen 3
T Warteschlange warten lassen bis Ereignis Java Basics - Anfänger-Themen 27
A Main warten lassen bis Variable durch Button übergeben wird Java Basics - Anfänger-Themen 2
V Warten bis die Länge eines Strings nicht mehr 0 ist Java Basics - Anfänger-Themen 13
M prozess starten und warten bis dieser sich beendet Java Basics - Anfänger-Themen 3
G Eigene Klasse für externe Befehle - Warten auf Prozesse Java Basics - Anfänger-Themen 6
D Auf Event warten Java Basics - Anfänger-Themen 4
F Logikproblem: Auf Mouselistener warten Java Basics - Anfänger-Themen 6
E Auf Mouselistener warten?! Java Basics - Anfänger-Themen 20
M Warten bis Thread an einem Semaphore angekommen ist Java Basics - Anfänger-Themen 4
C countdown/timer/Zeit warten lassen Java Basics - Anfänger-Themen 14
S Auf andere Methode warten Java Basics - Anfänger-Themen 7
B Während Schleife nicht auf Eingabe warten Java Basics - Anfänger-Themen 2
T auf vbscript warten Java Basics - Anfänger-Themen 3
S Thread warten abbrechen? Java Basics - Anfänger-Themen 5
C auf beendigung eines threads warten Java Basics - Anfänger-Themen 6
P Warten auf KeyTyped Java Basics - Anfänger-Themen 7
M warten in einer while-schleife Java Basics - Anfänger-Themen 12
L programm zum warten zwingen Java Basics - Anfänger-Themen 4
B Auf Programm warten Java Basics - Anfänger-Themen 2
S Auf Object warten Java Basics - Anfänger-Themen 2
K Auf File- Befehl warten. Java Basics - Anfänger-Themen 10
T eine Sekunde warten Java Basics - Anfänger-Themen 11
C Konsolenanwendung auf belibige Taste warten Java Basics - Anfänger-Themen 2
D Auf anderes Fenster Warten Java Basics - Anfänger-Themen 6
A Warten auf Userinput Java Basics - Anfänger-Themen 2
G Bei JDialog warten Java Basics - Anfänger-Themen 5
T Auf Selection warten Java Basics - Anfänger-Themen 7
N Java Insel 6 lesen oder auf 7 warten ? Java Basics - Anfänger-Themen 11
S Programmablauf pausieren, bzw. auf Eingabe warten Java Basics - Anfänger-Themen 4
G Warten auf Eingabe Java Basics - Anfänger-Themen 12
G Thread soll warten Java Basics - Anfänger-Themen 5
F 1 Minute warten Java Basics - Anfänger-Themen 18
S Thread auf Thread warten lassen. Java Basics - Anfänger-Themen 2
G auf ende mehrerer threads warten Java Basics - Anfänger-Themen 2
B Timer / Thread warten Java Basics - Anfänger-Themen 3
G warten Java Basics - Anfänger-Themen 10
P Warten-Fenster Java Basics - Anfänger-Themen 8
vogella *Gelöst *Im Programm warten (wait()) Java Basics - Anfänger-Themen 2
A Bitte Warten Java Basics - Anfänger-Themen 2
P Externen Proceß starten und warten bis beendet? Java Basics - Anfänger-Themen 2
J Threads: warten bis erste aktion ausgeführt wurde Java Basics - Anfänger-Themen 6
G Eine Methode zum Warten? Java Basics - Anfänger-Themen 7
G Frage zum Warten auf und Aufwecken von Threads Java Basics - Anfänger-Themen 2
L Einfaches Warten in eine Schleife Java Basics - Anfänger-Themen 9
B auf mehrere Threads warten Java Basics - Anfänger-Themen 3
K Animation warten lassen Java Basics - Anfänger-Themen 9
S Auf JInternalFrame warten? Java Basics - Anfänger-Themen 2
R Warten, bis ein Prozess gestartet wurde Java Basics - Anfänger-Themen 23
M x Sekunden warten Java Basics - Anfänger-Themen 13
P Bitte um ein paar Tipps! (Threads, Warten auf Ereignisse,.) Java Basics - Anfänger-Themen 2
M Wie lässt man eine Methode warten ohne Threads zu benutzen? Java Basics - Anfänger-Themen 8

Ähnliche Java Themen

Neue Themen


Oben