Java Frage zu sleep / wait - for schleife soll für paar sekunden ausgelassen werden

Zeboo

Lt. Commander
Registriert
Juli 2008
Beiträge
1.562
Hallo Java Profis!

Habe ein kleines Problem. Weiß nicht wie ich genau mit sleep bzw. wait in Java umgehen soll. Nehmen wir an ich hätte in eine Funktion mehrere schleifen:

PHP:
public void funktion() {

   for (iteriere...) {
      //aufgabe a
   }

   for (iteriere...) {
      //aufgabe b
   }

   for (iteriere...) {
      //aufgabe c
      if (eine tolle Bedingun) {
         Thread.sleep(100000);
      }
   }
}

Okey, wie ihr sieht, ist in der dritten Schleife was eingebaut. So geht das schonmal nicht, das kann ich sagen ;). Was ich will?

Also, diese Funktion wird mehrmals aufgerufen, sogar in Sekundentakt, in diese Funktion geht man mehrere Listen durch, da sind wie man hier sieht mehrere for Schleifen. Ich möchte, dass ab und zu eine der Schleifen "schläft", ignoriert wird bzw. nicht arbeitet. Dachte hier an sleep oder wait, aber das Problem daran ist, dass nicht nur die Schleife dann schläft sondern die ganze Funktion/Klasse. Das ist schlecht :/ Wie könnte ich das anders machen, so dass für eine bestimmte sekunde die eine Schleife einfach nicht ausgeführt wird?

Ich würde mich über ein paar Tips freuen. Danke.

Gruß
 
Zuletzt bearbeitet:
Multithreading ist hier das Schlüsselwort! Such im Netz nach wie man verschiedene Threads startet.
 
Wie schon gesagt geht das mit Threads, indem du deine 3. Schleife die evt. pausiert werden soll in einem eigenen Thread laufen lässt, das geht z.B so:

PHP:
    public void functionWithThread() {

    	for(...) {
    		
    	}
    	
    	for(...) {
    		
    	}

    	Thread myThread = new Thread(new Runnable() {
			@Override
			public void run() {
		    	for(...) {
		    		if(condition) {
		    			try {
							Thread.sleep(10000);
						} catch (InterruptedException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
		    		}
		    	}
			}
    	});
    	myThread.start();
    }
 
Mehrere Threads für so einfache Problemchen sind eigentlich immer mit Kanonen auf Spatzen und schleppen mehr Probleme ein als vorher da waren.

Wieso kannst du nicht einfach sowas machen:
Code:
public void funktion() {

   for (iteriere...) {
      //aufgabe a
   }

   for (iteriere...) {
      //aufgabe b
   }

   for (iteriere...) {     
      if (eine tolle Bedingun) {
         break;
      }
      //aufgabe c
   }
}

So wird die Schleife nur ausgeführt wenn die Bedingung erfüllt (bzw. nicht erfüllt ist) und die anderen laufen trotzdem. Du kannst durch setzen von Schaltern gezielt Steuern welche der Schleifen beim nächsten durchlauf abgelaufen werden soll. So kannst du z.B. jedes mal A, jedes 2. mal B und jedes 10. mal C laufen lassen ohne dich um Synchronisation kümmern zu müssen.
 
Er will ja die schleife mit Aufgabe a und b schlafen lassen. Ich vermute, dass er diese schleifen auch zufällig ins sleep schicken will, oder?

Multithreading ist vor allem in Java viel einfacher als bei C# oder C++. Hmm aber wenn ich genauer nachdenke, so gibts für C# Bibliotheken Backgroundworker mit Asynchroner Ausführung. Da spart man ja viel arbeit ;)
 
Wieso ist multithreading in java einfacher als in .net? Er möchte Teile einer Funktion zu bestimmten Zeiten aussetzen. Das geht wohl am einfachsten wenn man sie guarded und die speziellen teile selektiv über trigger schalten kann.
 
Naja einen Thread in Java ist schon aus technischen Gründen leichter zu erzeugen. Muss aber dazu sagen... ich habe Multithreading programmiert aber ich musste noch nie die Daten zwischen den Threads austauschen. Naja ich lasse es lieber sein, muss mich wieder einlesen bevor ich weiter was sagen kann.
 
mach doch einfach

Code:
public void funktion() {
 switch (xxxxxx){
case 1:
   for (iteriere...) {
      //aufgabe a
   }
 break;
case 2:
   for (iteriere...) {
      //aufgabe b
   }
  break;

case 3:
   for (iteriere...) {
      //aufgabe c

   } 
   break;
   }

     Thread.sleep(100000);
}


wennde das konstrukt in mehreren threads laufen lässt (zb. 3 mal), kannste da mit primzahlwartezeiten schon tolle pausen hinbekommen.
 
Die Lösung von ljnk erscheint mir bislang am elegantesten, auch wenn "break" nur sehr wohl überlegt eingesetzt werden sollte. Hier scheint es mir angebracht, weil es umständliche und schwer wartbare Code umgeht.

Die break-Lösung hat nur evtl. einen Nachteil. Wenn es gewünscht ist, dass die Wartezeit auf jeden Fall eingehalten wird, dann würde diese Lösung die Schleife vorzeitig wieder ausführen, sofern die bedingungsauswertung sich zwischenzeitlich verändert hat.

Wenn das also eine wichtige Anforderung wäre, dann könntest du folgendes machen.

Du legst dir eine InstanzVariable (WICHTIG!) an, die aussagt, ab wann Aufgabe c wieder ausgeführt werden darf. Diese Zeit vergleichst du mit der aktuellen Zeit und brichst die Ausführung entsprechend ab.

Code:
private long doNotExecuteBefore = 0;

public void funktion() {

   for (iteriere...) {
      //aufgabe a
   }

   for (iteriere...) {
      //aufgabe b
   }

   if (System.currenTimeMillis() >= doNotExecuteBefore) {
     for (iteriere...) {
        if (eine tolle Bedingun) {
          doNotExecuteBefore = System.currenTimeMillis() + 100000;
        }
        else
        {
          //aufgabe c
        }
     }
   }
}

Man könnte, um ein eine einzige weitere Iteration zu verhindern, noch ein "break;" hinter der Zuweisung platzieren.
 
Zurück
Oben