Pause ohne sleep und ohne zweiten Thread

G

Gast2

Gast
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:
Java:
        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

schlingel

Gesperrter Benutzer
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?
 
G

Gast2

Gast
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)

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.
 
G

Gast2

Gast
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

schlingel

Gesperrter Benutzer
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.
 
M

mjustin

Aktives Mitglied
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."
 

Ähnliche Java Themen

Anzeige

Neue Themen


Oben