While-Schleife nach 10 sekunden abbrechen.

Status
Nicht offen für weitere Antworten.
S

sunnyfriday1

Gast
Hallo,

Ich habe folgendes Problem:

Ich habe einen Thread. In der run() Methode habe ich eine whileschleife die nach 3 Zuständen pollt, bis ich den zustand setzte.

Ich möchte aber das die while- schleife max. 10 sekunden nach den zuständen pollt. Wenn nach 10 sekunden kein definierter zustand erkannt wird, dann whileschleife verlassen(timeout).

Hat jemand ne idee?

Code:
class MyThrad extends Thread {

 int zustand;

 public void run(){


       while(!isInterrupted()){
  
            if(zustand ==1) System.out println("zustand1");
            if(zustand ==2) System.out println("zustand2");
            if(zustand ==3) System.out println("zustand3");

       }

 }

  setzustand(int zustand){

   this.zustand = zustand;

  }

}

danke sunny
 
S

SlaterB

Gast
deine jetzige Schleife sorgt für 100% CPU lasst,
reicht es nicht, < 100 mal pro Sekunde den Wert zu prüfen statt 1 Mio. mal oder noch öfter?

von außen kannst du die Schleife nicht abbrechen,
aber du kannst die while-Bedingung ändern, Zeitmessung ist dir bekannt?
 

Marco13

Top Contributor
'n Timer vielleicht - aber wenn's eh schon ein eigener Thread ist, tut's wohl schon sowas wie
Code:
public void run(){

       long before =System.currentTimeMillis();
       while(!isInterrupted() && System.currentTimeMillis() < before + 10000){
 
            if(zustand ==1) System.out println("zustand1");
            if(zustand ==2) System.out println("zustand2");
            if(zustand ==3) System.out println("zustand3");

       }

}

EDIT: Ja, das ist häßlich - aus dem Grund, den SlaterB schon genannt hat: Es frißt Rechenleistung. Mit wait(timeout) und notfy() im setState wär's natürlich schöner, aber danach hast du ja nicht gefragt :bae:
 
G

Guest

Gast
Könnte das vielleicht helfen?
Code:
class MyThrad extends Thread {

 int zustand;

 public void run(){
       //Endzeitpunkt des Pollens festlegen, aktuelle Zeit + 10 Sekunden
       long endZeitpunkt = System.currentTimeInMillis()+10000;
       //zusätzlich abfragen ob die 10 Sekunden nicht schon rum sind
       while(!isInterrupted() && endZeitpunkt >= System.currentTimeInMillis()){
  
            if(zustand ==1) System.out println("zustand1");
            if(zustand ==2) System.out println("zustand2");
            if(zustand ==3) System.out println("zustand3");

       }

 }

  setzustand(int zustand){

   this.zustand = zustand;

  }

}
 
G

Gast

Gast
Gegen das ständige Pollen, könnte auch eine Lösung nach dem Observer-Pattern angestrebt werden.
 

xysawq

Bekanntes Mitglied
Mach nen Timer der ohne delay gestartet wird und die run()-Methode mit while-Schleife startet, die solange läuft wie eine boolean-Variable true ist.

Nach einer festgelegten Zeit (z.B. 10 Sekunden) startet dr Timer wieder und setzt die boolean-Variable auf false und wird beendet.

Code:
class MyThread extends TimerTask
{
	int zustand;
	Timer timer = new Timer();
	boolean run = false;
	
	public void start()
	{
		timer.scheduleAtFixedRate(this, 0, 10000);
	}

	public void run()
	{
		if(run)
		{
			run = false;
			timer.cancel();
		}
		else
		{
			run = true;
			work();
		}
	}
	
	private void work()
	{
		while(run)
		{	 
			if(zustand ==1) System.out println("zustand1");
			if(zustand ==2) System.out println("zustand2");
			if(zustand ==3) System.out println("zustand3");
		}
	}

	public void setzustand(int zustand)
	{
	   this.zustand = zustand;
	}
}

So zum Beispiel.
 

Marco13

Top Contributor
Ja, nachdem so viele "so-kann-mans-machen-sollte-man-aber-nicht"-Lösungen gepostet wurden, das ganze nochmal mit wait&notify...
Code:
// For [url]http://www.java-forum.org/de/viewtopic.php?t=74209&highlight=[/url]


class WaitingThread extends Thread
{
    public static void main(String args[])
    {
        WaitingThread wt = new WaitingThread();
        wt.start();

        setZustandAfter(wt, 0, 1000); // Wartet weiter
        setZustandAfter(wt, 0, 3000); // Wartet weiter
        setZustandAfter(wt, 2, 5000); // Beendet


        wt = new WaitingThread();
        wt.start();
        // warten bis Timeout
    }

    private static void setZustandAfter(final WaitingThread wt, final int zustand, final int delay)
    {
        Thread t = new Thread(new Runnable()
        {
            public void run()
            {
                try
                {
                    Thread.sleep(delay);
                }
                catch (InterruptedException e)
                {
                }
                wt.setZustand(zustand);
            }
        });
        t.start();
    }




    private int zustand;

    public void run()
    {
        long start = System.currentTimeMillis();
        long end = start + 10000;

        while (zustand == 0)
        {
            long timeout = end - System.currentTimeMillis();
            if (timeout <= 0)
            {
                break;
            }
            synchronized (this)
            {
                if(zustand == 0) System.out.println("zustand0");
                if(zustand == 1) { System.out.println("zustand1"); break; }
                if(zustand == 2) { System.out.println("zustand2"); break; }
                if(zustand == 3) { System.out.println("zustand3"); break; }

                try
                {
                    System.out.println("Waiting for less than "+timeout+" ms");
                    wait(timeout);
                }
                catch (InterruptedException e)
                {
                    System.err.println("Interrupted!");
                    return;
                }

            }
        }
        System.out.println("Finished waiting after "+(System.currentTimeMillis()-start)+" ms, zustand "+zustand);
    }

    synchronized void setZustand(int zustand)
    {
        this.zustand = zustand;
        notify();
    }

}

Kann man immernoch aufräumen, aber das Prinzip dürfte so passen....
 

sunnyfriday

Aktives Mitglied
Was spricht eigentlich gegen diese Lösung??
Ich wollte doch nur dass mein thread einfach nur 10 sekunden pollt. Und wenn er nichts gefunden hat, dann verabschiedet er sich einfach.
Die anderen lösungen verwirren mich total... ;-)

Code:
class MyThrad extends Thread { 

int zustand; 

public void run(){ 
       //Endzeitpunkt des Pollens festlegen, aktuelle Zeit + 10 Sekunden 
       long endZeitpunkt = System.currentTimeInMillis()+10000; 
       //zusätzlich abfragen ob die 10 Sekunden nicht schon rum sind 
       while(!isInterrupted() && endZeitpunkt >= System.currentTimeInMillis()){ 
  
            if(zustand ==1) System.out println("zustand1"); 
            if(zustand ==2) System.out println("zustand2"); 
            if(zustand ==3) System.out println("zustand3"); 

       } 

} 

  setzustand(int zustand){ 

   this.zustand = zustand; 

  } 

}
 

sunnyfriday

Aktives Mitglied
hallo ;-)


und so?
Code:
class MyThrad extends Thread { 

int zustand; 

public void run(){ 
       //Endzeitpunkt des Pollens festlegen, aktuelle Zeit + 10 Sekunden 
       long endZeitpunkt = System.currentTimeInMillis()+10000; 
       //zusätzlich abfragen ob die 10 Sekunden nicht schon rum sind 
       while(!isInterrupted() && endZeitpunkt >= System.currentTimeInMillis()){ 
  
            if(zustand ==1) System.out println("zustand1"); 
            if(zustand ==2) System.out println("zustand2"); 
            if(zustand ==3) System.out println("zustand3"); 
        
        sleep(100); !!!!!

       } 

} 

  setzustand(int zustand){ 

   this.zustand = zustand; 

  } 

}
 
S

SlaterB

Gast
sleep könnte eine leere Methode sein,
aber ich vertraue mal darauf, dass das so deutlich besser ist ;)

zu bedenken:
wenn du Pech hast, dauert die Schleife so 10,099 Sekunden
 

xysawq

Bekanntes Mitglied
Übrigens: bei meiner vorher geposteten Variante brauchst du nicht bei jedem while-Durchlauf die Zeit prüfen...

Der Timer macht das voll-automatisch und braucht auch exakt 10000 Millisekunden und nicht 10099!

Du erstellt nicht mehrere Threads oder machst irgendwelche anderen Faxen, sonder du startest den Timer und der Rest läuft von selbst, beendet sich von selbst und du kannst den ganzen Spaß auch immer und immer wieder neu starten.

Bezüglich der CPU-Last kannst du natürlich auch noch ein Thread.sleep(1); einbauen, dann wird eben nur jede Millisekunde geschaut, aber nicht aller 100.

Bei mir sind die Timer immer verbaut, wenn ich was machen möchte, was eine bestimmte Zeit dauert oder in bestimmten Intervallen stattfinden soll.
 

Marco13

Top Contributor
Ja. Ich hab auch immer meinen Mail-Client offen, und klick' alle 100 Millisekunden auf "Neue Nachrichten abrufen"....
 

sunnyfriday

Aktives Mitglied
hallo,

ich habe ein weiteres Problem bekommen.
und zwar:

Die Objekte zustand1, zustand2, zustand3 implementieren alle ein Interface mit den Methoden read() und write()

Ich habe die read() und write() Aktionen im einer Funkton work() ausgelagert (siehe code).

Wieso funktioniert das nicht so wie ich es in work() gemacht habe?



Code:
class MyThrad extends Thread {

int zustand;

public void run(){


       while(!isInterrupted()){
 
            if(zustand ==1) {
            
                  work(new zustand1());
            }

           if(zustand ==2) {
            
                  work(new zustand2());
            }

          if(zustand ==3) {
            
                 work(new zustand3());
            }

       }

}



public void work(Object zustand){

   if( zustand isinstanceof zustand1){
      zustand1 neuzustand = new zustand1();

    }

   if( zustand isinstanceof zustand2){
      zustand2 neuzustand = new zustan2();

    }

   if( zustand isinstanceof zustand3){
      zustand3 neuzustand = new zustan3();

    }


    zustand.read();
    zustand.write();


}





  setzustand(int zustand){

   this.zustand = zustand;

  }

}
 

xysawq

Bekanntes Mitglied
Du erzeugst ziemlich sinnlos Instanzen von den Zuständen. Es währe einfacher in der while-Schleife zu schauen, ob sich "int zustand" verändert hat, zudem initialisierst du diese Variable nicht (also "int zustand = 0"). So hast du nur den Namen reserviert und das Programm weiß garnicht was es jetzt mit 1, 2 oder 3 vergleichen soll.

Also:
Code:
class MyThrad extends Thread
{
	int zustand = 0;
	int alterZustand = 0;

	public void run()
	{
		while(!isInterrupted())
		{
			if(zustand != alterZustand)
			{
				alterZustand = zustand;
				work(zustand);
			}
		}
	}

	public void work(int neuerZustand)
	{
		if(neuerZustand == 1)
		{
			zustand1 neuzustand = new zustand1();
		}
		if(neuerZustand == 2)
		{
			zustand2 neuzustand = new zustand2();
		}
		if(neuerZustand == 3)
		{
			zustand3 neuzustand = new zustand3();
		}

		neuzustand.read();
		neuzustand.write();
	}

	setzustand(int zustand)
	{
		this.zustand = zustand;
	}
}
 

sunnyfriday

Aktives Mitglied
hallo,

wenn ich aber in work()

neuzustand.read(); aufrufe,

dann kommt die fehlermeldung "neuzustand kann nicht aufgelöst werden".
 

xysawq

Bekanntes Mitglied
Achja... ist ja auch klar ^^... die existiert ja nur in der IF-Schleife

Dann brauchst du ein Interface oder eine abstrakte Klasse (Interface finde ich besser), das die Methoden read() und write() vorschreibt und deine Zustand-Klassen implementieren dieses Interface, bekommen somit auch die Methoden, dann nur noch:

Code:
   public void work(int neuerZustand)
   {
      ZustandInterface neuzustand = null;

      if(neuerZustand == 1)
      {
         neuzustand = new zustand1();
      }
      if(neuerZustand == 2)
      {
         neuzustand = new zustand2();
      }
      if(neuerZustand == 3)
      {
         neuzustand = new zustand3();
      }

      neuzustand.read();
      neuzustand.write();
   }

Und es geht ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Wert einer while-Schleife nach Abarbeitung Java Basics - Anfänger-Themen 2
M While-Schleife mit Wartezeit Java Basics - Anfänger-Themen 15
Ranger229 Endless loop in while Schleife Java Basics - Anfänger-Themen 3
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
Ostkreuz While Schleife neustarten Java Basics - Anfänger-Themen 20
S Erste Schritte do-while Schleife Münzwurf Java Basics - Anfänger-Themen 1
S while Schleife Taschenrechner Java Basics - Anfänger-Themen 1
P Best Practice While loop schleife Java Basics - Anfänger-Themen 5
A Erste Schritte Aufgabe mit while Schleife Java Basics - Anfänger-Themen 11
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
A Return in While Schleife Java Basics - Anfänger-Themen 6
M Erste Schritte While Schleife / Ausgabe von buchstabe & ASCII Wert Java Basics - Anfänger-Themen 4
J do..while Schleife Java Basics - Anfänger-Themen 14
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
JavaBeginner22 Würfeln bis 6 while Schleife Java Basics - Anfänger-Themen 13
L while Schleife mit 2 Bedingung endet nicht Java Basics - Anfänger-Themen 3
D Array mit while-schleife Java Basics - Anfänger-Themen 12
B do while Schleife Java Basics - Anfänger-Themen 3
SergioCK Do while Schleife wiederholen Java Basics - Anfänger-Themen 14
Informatikf Methoden While Schleife Java Basics - Anfänger-Themen 3
M While Schleife? Java Basics - Anfänger-Themen 4
Poppigescorn Quersumme Berechnen mit einer While Schleife Java Basics - Anfänger-Themen 13
M Wie kann ich Werte die in einer While Schleife sind weiter genutzt werden? Java Basics - Anfänger-Themen 7
H Kann eine while-Schleife ein Programm blockieren? Java Basics - Anfänger-Themen 8
O Methode in while-Schleife aufrufen geht nur beim ersten Mal Java Basics - Anfänger-Themen 2
A Wie schaffe ich das eine while Schleife addiert danach subtrahirt? Java Basics - Anfänger-Themen 1
J for /while Schleife Java Basics - Anfänger-Themen 5
A While Schleife - buubelsort methode Java Basics - Anfänger-Themen 2
J Wie kann ich hier eine While schleife einbauen? Java Basics - Anfänger-Themen 3
S While-Schleife geht in Endlosschleife über, warum? Java Basics - Anfänger-Themen 6
S Do-While-Schleife Java Basics - Anfänger-Themen 2
S While Schleife Java Basics - Anfänger-Themen 4
S Do-While Schleife Java Basics - Anfänger-Themen 6
L String in Do-While-Schleife Abbruchkriterium Java Basics - Anfänger-Themen 1
CptK Methoden While-Schleife so lange ausführen, wie Methode etwas zurückgibt Java Basics - Anfänger-Themen 2
B Verschachtelung von For-Schleife in While Schleife Java Basics - Anfänger-Themen 14
G while schleife Java Basics - Anfänger-Themen 11
G while schleife mit array Java Basics - Anfänger-Themen 12
L Scanner schließen in While-Schleife? Java Basics - Anfänger-Themen 2
G While schleife Java Basics - Anfänger-Themen 2
mor16Euro Erste Schritte Wie nennt man eine While oder For schleife die nie Ausgeführt wird Java Basics - Anfänger-Themen 5
C Verständnisfrage bezüglich der Do-While Schleife Java Basics - Anfänger-Themen 9
B OOP While Schleife läuft Endlos durch externen aufruf Java Basics - Anfänger-Themen 2
N while Schleife wird nicht beendet, obwohl Sie hätte breaken sollen Java Basics - Anfänger-Themen 4
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
D While Schleife bei Bedarf durch Eingabe stoppen Java Basics - Anfänger-Themen 15
A Erste Schritte while-Schleife Java Basics - Anfänger-Themen 38
X While Do schleife funtioniert nicht Java Basics - Anfänger-Themen 5
J 2 "while"-Anweisungen in einer do-Schleife? Java Basics - Anfänger-Themen 4
W while Schleife und Bedingung Java Basics - Anfänger-Themen 11
T While Schleife funktioniert nicht Java Basics - Anfänger-Themen 14
J Input/Output Strings aneinander reihen mit while schleife Java Basics - Anfänger-Themen 25
S Try-Catch in Verwendung einer while Schleife Java Basics - Anfänger-Themen 2
P a cannot be resolved bei einer do while Schleife Java Basics - Anfänger-Themen 1
J While Schleife Java Basics - Anfänger-Themen 19
Z Return in While-Schleife Java Basics - Anfänger-Themen 7
N Methode mit While-Schleife und If-Bedingung und Array-Initialisierung Java Basics - Anfänger-Themen 4
V Erste Schritte Habe Fragen zu der For und While Schleife als auch Inkrement und Dekrement Java Basics - Anfänger-Themen 4
helldunkel While Schleife trotz false Java Basics - Anfänger-Themen 4
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
R While-Schleife macht nicht was sie soll Java Basics - Anfänger-Themen 24
b1ck while-Schleife Java Basics - Anfänger-Themen 10
b1ck Integer initialisieren bei do-while-Schleife Java Basics - Anfänger-Themen 11
kilopack15 DoWhile-Schleife als While-Schleife darstellen Java Basics - Anfänger-Themen 9
A While-Schleife funktioniert nicht! Java Basics - Anfänger-Themen 33
A Verständnisproblem Ausgabe Do-While-Schleife Java Basics - Anfänger-Themen 3
E Alphabet mit einer while Schleife ausgeben Java Basics - Anfänger-Themen 3
T while schleife starten , beeneden und wieder Starten Java Basics - Anfänger-Themen 8
W Verständnis Probleme bei der while-Schleife und continue Java Basics - Anfänger-Themen 21
B Passwort prüfen bis eindeutig - while Schleife? Java Basics - Anfänger-Themen 11
$ Multiplikations-Rechner mit while Schleife Java Basics - Anfänger-Themen 8
T Variablen Var aus While-Schleife abfragen -.-' Java Basics - Anfänger-Themen 9
snipesss Schlüsselworte While Schleife Java Basics - Anfänger-Themen 3
snipesss While Schleife Java Basics - Anfänger-Themen 6
A Do-While Schleife; int vergleich Java Basics - Anfänger-Themen 2
K For Schleife in While Schleife umwandeln Java Basics - Anfänger-Themen 5
Ste3et_C0st Dynamische While/For Schleife Java Basics - Anfänger-Themen 7
L do-while-Schleife läuft doppelt, try catch fehler Java Basics - Anfänger-Themen 12
A While und For Schleife Java Basics - Anfänger-Themen 2
C Erste Schritte Frage zur do while- und while-Schleife Java Basics - Anfänger-Themen 4
C Do-While Schleife (Fehler bei der Klammerung?) Java Basics - Anfänger-Themen 8
C while-Schleife wird zuoft durchgeführt Java Basics - Anfänger-Themen 2
F Problem do while Schleife und Scanner Java Basics - Anfänger-Themen 2
F Programm bricht While Schleife nicht ab Java Basics - Anfänger-Themen 4
S Verständnis - Frage mehrere SQL Statements in While Schleife Java Basics - Anfänger-Themen 0
C Erste Schritte Warum ist die While Schleife so schnell? Java Basics - Anfänger-Themen 5
A was wird in der while schleife gemacht Java Basics - Anfänger-Themen 3
A Kleines Abbruch-Problem mit Do-While-Schleife Java Basics - Anfänger-Themen 4
Z Logikfehler do-while Schleife Java Basics - Anfänger-Themen 4
E While-Schleife Java Basics - Anfänger-Themen 6
D Textfield im Game ,Problem: while-Schleife Java Basics - Anfänger-Themen 1
A Probleme mit While Schleife Java Basics - Anfänger-Themen 10
M Fibonacci-Folge mit while-Schleife Java Basics - Anfänger-Themen 4
B Summe aller Zahlen von 1 bis zu dieser Zahl (ohne while oder for schleife) Java Basics - Anfänger-Themen 4
LangUndBreit Erste Schritte 100% cpu auslastung (evtl unendliche while schleife?) Java Basics - Anfänger-Themen 1
T Wie vergleiche ich die Jahre aus der while Schleife die in ( public class) fuer cbx geschrieben sind Java Basics - Anfänger-Themen 5
T while Schleife Java Basics - Anfänger-Themen 22
N While Schleife Erklärung Bitte Java Basics - Anfänger-Themen 3
F Problem mit der While schleife und dem Scanner Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben