# Code später ausführen



## Dr1ton (28. Feb 2012)

Hi Leute,

suche eine Möglichkeit bestimmte Codeabschnitte verspätet auszuführen. Dieser Code soll mit einer Verzögerung von 2 Sekunden laufen.

Kann mir jemand sagen wie ich das realisieren kann zbw. gibts ne Klasse (mit Methode) die das für mich übernimmt?

Gruß
Dr1ton


----------



## Beni (28. Feb 2012)

Ein [JAPI]java.util.Timer[/JAPI] könnte dir helfen.


----------



## njans (28. Feb 2012)

Nun wenn du wirklich etwas verzögern willst, dann würdest du mit Thread.sleep(millisekunden); wohl sowas erreichen.
Dabei solltest du beachten, dass du damit den Thread, auf dem du das aufrufst, auch lahm legst. Also wenn du das auf dem EDT (dem Gui Thread) aufrufst, verändert sich in den 2 Sekunden nicht mehr an de gUi und du kannst nicht mehr mit dieser interagieren. 
Daher sollte das in einem gesonderten Thread verwendet werden, sofern du die Gui benötigst.

[TIPP]
Benis Idee beinhaltet schon, dass ein neuer Thread verwendet wird. Ebenfalls kann man mit dem util.Timer wunderbar ein delay setzen. Empfehlen würde ich dir wohl, sofern du eh einen neuen Thread erstellen musst, dass du Benis Vorschlag folgst.
[/TIPP]


----------



## Crian (28. Feb 2012)

Oder du startest etwas in zwei Sekunden. Das geht auch im EDT.


----------



## Dr1ton (28. Feb 2012)

Hi,

wenn ich Thread.sleep(millisekunden); anwende, wird der komplette thread verlangsamt -> das sollte nicht passieren.

Ich möchte es so realisieren (homedesign-technisch), dass erst ein Teil des codes ausgeführt wird , kurze Pause, dann zweiter Teil des Codes. Mit Thread.sleep funktioniert das leider nicht.


Ich habe mir java.util.Timer  angeschaut, hätte jetzt eine Frage bezüglich der Methoden die angesprochen werden müssten um eine kleine Verzögerung zu realisieren.

Hat da jemand konkrete Beispiele? Vielen Dank für eure Hilfe.


Gruß
Dr1ton


----------



## jgh (29. Feb 2012)

hier mal ein Minimalbsp mit Konsolenausgabe:
Die endlos-Schleife schreibt alle 2 sec eine Ausgabe auf die Konsole, alle 10 sec kommt ein anderer Thread und schreibt halt was anderes....


```
public class DelayExample {
	public static void main(String[] args) {
		new DelayExample();

	}

	private int i = 1;

	public DelayExample() {

		new Thread(new Runnable() {

			@Override
			public void run() {
				while (true) {
					try {
						Thread.sleep(10000);
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
					System.out
					.println("\tunterbricht die Endlosschleife alle 10 sec");
				}
			}
		}).start();
		endlosSchleife("Ich bin eine Endlosschleife");
	}

	private void endlosSchleife(String s) {
		while (true) {
			System.out.println(s + " im " + i + ". Durchgang");
			i++;
			try {
				Thread.sleep(2000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}
}
```


----------



## freez (29. Feb 2012)

Dr1ton hat gesagt.:


> Ich möchte es so realisieren (homedesign-technisch), dass erst ein Teil des codes ausgeführt wird , kurze Pause, dann zweiter Teil des Codes. Mit Thread.sleep funktioniert das leider nicht.



Ich verstehe dein problem anders als mein 'Vorredner':

```
public class DelayExample implements Runnable{
    public static void main(String[] args) {
        new DelayExample();
 
    }
 
    public DelayExample() { 
        new Thread(this).start();	//Starte deine beiden Code Teile mit 2 Sekunden Unterschied
        doOtherThings();				//Hier kann gleich irgendwas anderes gemacht werden, während die anderen beiden do's() laufen
    }	
	
	public void run() {
			do1();	//Erster Teil der Ausführung
			 try {  Thread.sleep(2000); } catch (InterruptedException e) {}
			 do2();	//Zweiter Teil der Ausführung
    }
}
```

do1() und do2() sind deine beiden Codeteile, die du 2 Sekunden lang voneinander trennen willst. Somit würde ich einen Thread starten, der beide Teile ausführt und dazwischen 2 Sekunden schläft. Die Methode in der der Start ausgelöst wird (in meinem Fall der Konstruktor) kann dann während do1 und do2 läuft weiter arbeiten, oder auch nix mehr machen. Somit hängt deine GUI nicht, und du könntest sogar einen Status anzeigen lassen oä.


----------



## KrokoDiehl (29. Feb 2012)

Hier mal ein "Einzeiler"-Beispiel mit dem bereits angesprochenen Timer:


```
new Timer("Name").schedule(new TimerTask() {
            @Override
            public void run() {
                // ich werde in 5000 MSek ausgeführt
            }
        }, 5000L);
```


----------



## Landei (29. Feb 2012)

Für oberflächliche Angelegenheiten gibt es noch [c]javax.swing.Timer[/c].


----------

