Wie kann man in Java eine Abfolge von befehlen zeitlich versetzt abspielen.

...komplette Frage anzeigen

2 Antworten

In der Klasse java.lang.Thread gibt es eine Funktion namens sleep(long millis), die steht sowohl statisch als auch für einzelne Instanzen von Thread zur Verfügung.

Thread.sleep(1000);//Dieser Befehl dauert genau eine Sekunde.

Aber Thread.sleep wirft eine IOException und muss daher in einen try - catch Block.

Thread.sleep() ist (fast immer) ein Anzeichen für schlechten Codestil und ist unter Windowssystemen auch nicht besonders genau.

Ein Executor ist hier besser geeignet, da damit unteranderem auch die Trennung der einzelnen Befehle deutlicher wird.

0
@Infam0usLight

Das behauptest du einfach so in die Luft.

Du gibst weder einen Grund an, warum das schlechter Stil sein soll, noch erklärst du, was besser wäre.

Danke für diesen sinnvollen und hilffreichen Beitrag.

0
@PerfectMuffin

Einen habe ich doch schon genannt ;) Unter Windows arbeitet es einfach nicht so wie es soll. Mal dauert der sleep() länger mal kürzer. Hältst du das etwa für "guten Code"?

Dann noch ein anderer Punkt. Java's implementierung von sleep() zufolge kann es passieren das ein aufgewachter Thread nicht sofort weiter ausgeführt wird da er keine CPU Leistung zugesprochen bekommt. Stattdessen muss er mit anderen Threads darum "kämpfen".

Weiterhin kann Thread.sleep() sogar die Ausführung von anderen Threads blocken, was man im folgenden Beispiel sehen kann:

http://kamilkulaga.blogspot.de/2011/02/good-example-for-bad-usage-of.html

noch erklärst du, was besser wäre.

Ein Executor ist hier besser geeignet ...Lesen sollte man schon...

Genauer gesagt, der ScheduledExecutorService, da sein entsprechender schedule()-Aufruf System.nanoTime anstatt currentTimeMillis benutzt, welches deutlich weniger schlimm abdriftet.

Desweiteren arbeitet es sich mit Executors besser als mit den "rohen" Threads an sich, da diese unteranderem eine effizientere Abstraktion der Behandlung von Runnable's darstellen. Gucks dir einfach selber an. Gibt eigentlich keinen Grund warum man Threads einem Executor vorzieht, außer dem,dass man Executor's noch nicht kennt ;)

0
@Infam0usLight

Da hast du Recht, aber da du nicht direkt den genauen Namen von Executor genannt hast, habe ich nicht so viel damit anfangen können(beim durchsuchen der API passieren komische Sachen.)

Ich habe mich nicht geärgert, dass du GAR NICHTS gesagt hast, sondern, dass du nichts gesagt hast, mit dem ich etwas anfangen konnte. Ansonsten danke, ich werde mal den Executor ausprobieren.

0
@PerfectMuffin

Wenn ich mir das Executor Interface in der DOC angucke steht dort folgendes:

All Known Subinterfaces:

ExecutorService, ScheduledExecutorService

All Known Implementing Classes:

AbstractExecutorService, ScheduledThreadPoolExecutor, ThreadPoolExecutor 

Ein Klick auf ein jeweiliges Subinterface, z.B. auf den ScheduledExecutorService und du hast alles was du brauchst ;)

Aber ok, die Dokumentation kann manchmal wirklich ziemlich irreführend sein, vor allem wenn man damit nicht beruflich arbeiten muss.

Sonst ist es aber auch ganz gut bei der Insel zusammengefastt (Threads mit Rückgabe über Callable ist recht interessant wenn man bisher nur mir normalen Threads gearbeitet hat):

http://openbook.galileocomputing.de/javainsel9/javainsel_14_004.htm#mj2f866e14a50f07accd817e14e068e022

0

delay von 1000 ms ;)

wie sieht der befehl dafür genau aus? danke

0

Was möchtest Du wissen?