# Pause ohne sleep und ohne zweiten Thread



## Gast2 (12. Sep 2012)

Hi,

ich brauche in meinem Programmablauf eine Pause (z.B. 2Sek.).
Aus technischen Gründen kann / will ich keinen zweiten Thread eröffnen,
also fällt Thread.sleep weg.

Als Alternative habe ich mir überlegt mit dem *Timestamp *zu arbeiten.
Sieht so aus:
	
	
	
	





```
long now = System.nanoTime();        
		long end = now + 10000000;
		
		txv.setText("Anfang");
		
		while (System.nanoTime() < end ) {
			txv.setText(String.valueOf(now));
		}
		
		txv.setText("Ende");
```

Aber sobald ich das Programm starte, steht "Ende" auf dem Bildschirm.
*Warum funktioniert das nicht?*

Frank


----------



## schlingel (12. Sep 2012)

Eine Nanosekunde sind 0,000 000 001 Sekunden

0,000.000.001 * 10.000.000 = 0,01 Sekunden Verzögerung die du deinem Programm hier gibst. Das ist relativ wenig und könnte dazu führen, dass es so aussieht als gäbe es keine Verzögerung.

Aber busy waiting hat andere Nachteile. Wenn du den UI-Thread blockierst (ich nehme mal an du bist in einem, wenn nicht gibt's andere Probleme mit dem Setzen von UI-Komponenten außerhalb des UI-Threads), wird das System davon ausgehen, dass deine App hängt und den "Möchten Sie die App beenden"-Dialog anzeigen.

Was sind denn die technischen Gründe, dass die Lösung mit einem AsyncTask nicht in Frage kommen?


----------



## Gast2 (12. Sep 2012)

schlingel hat gesagt.:


> Eine Nanosekunde sind 0,000 000 001 Sekunden
> 0,000.000.001 * 10.000.000 = 0,01 Sekunden



Ich hatte sooo viele Nullen angehangen, dass ich dachte es müßte reichen. 
mit 2 Sekunden ist es sichtbar. (und unterhalb eines Time Out)



schlingel hat gesagt.:


> Was sind denn die technischen Gründe, dass die Lösung mit einem AsyncTask nicht in Frage kommen?



Der Grund ist, dass der Hauptthread weitergeht und der dem sleep nachfolgende Befehl ausgeführt wird, bevor Thread.sleep zuende ist.


----------



## Gast2 (12. Sep 2012)

Jetzt nach der Implementierung sehe ich, dass mein Problem im Ablauf gar nicht mit dem 2.Thread (für sleep) zu tun hat. Auch bei Verwendung des TimeStamp treten ungelöste Rätsel auf.


----------



## schlingel (12. Sep 2012)

Thread Synchronisierung darf niemals, wirklich niemals, über waiting, sei es busy oder per sleep, passieren. Es garantiert dir niemand, dass die Threads genau parallel ablaufen oder das Thread 1 immer vor Thread 2 läuft. Das einzige was dir garantiert wird ist, dass die Threads laufen. (meistens ;-))

Hier solltest du einmal die Architektur überdenken und die Synchronisierung per Events steuern und gegebenenfalls auf lock, Monitore oder Semaphoren zurückgreifen um tatsächlich sicherzustellen, dass die Threads nicht irgendwann das tun was sie wollen.


----------



## mjustin (12. Sep 2012)

frankmehlhop hat gesagt.:


> Aus technischen Gründen kann / will ich keinen zweiten Thread eröffnen,
> also fällt Thread.sleep weg.



Das 'also' ist mir unklar - Thread.sleep() kann nie einen zweiten Thread ansprechen oder gar einen starten. Es wirkt immer auf den aktuellen Thread.

Thread (Java 2 Platform SE v1.4.2)

sleep - "Causes the currently executing thread to sleep (cease execution) for the specified number of milliseconds plus the specified number of nanoseconds."


----------

