Wie macht man einen Timer(Java)?
Hello, wie macht man einen Timer in Java
ich meine damit, dass z.b. jede Sekunde etwas passiert, oder jede paar Ms.
2 Antworten
Ich denke mal, du meinst, wie man sowas mit der Java SE macht und nicht wie man sowas selbst implementiert (ist eigentlich gar nicht so schwer).
Die Klasse heißt sogar Timer: https://docs.oracle.com/javase/9/docs/api/java/util/Timer.html
Mit den schedule() Methoden kannst du einen Task mit einem Delay und oder wiederholt ausführen. Die Tasks sollten schnell erledigt sein, ansonsten kann es dazu kommen, dass nachfolgende Tasks verzögert werden. Ist das der Fall, musst du diese Tasks in einem weiteren Thread ausführen.
Außerdem ist es zu empfehlen daemon im Konstruktor zu aktivieren, sonst läuft dein Programm ewig weiter, wenn der Timer nicht manuell beendet wird.
Also so sieht das Grundbeispiel aus, nur ein Delay:
Timer test = new Timer();
test.schedule(new TimerTask() {
@Override
public void run() {
System.out.println("1 second delay.");
}
}, 1000);
Der zweite Parameter ist für die Verzögerung und der dritte (unten verwendet) für die Periodendauer. Wenn du moderne Java 8 Funktionen wie Lambdas nutzen willst, musst du eine Wrapper Methode schreiben:
private static TimerTask wrap(Runnable r) {
return new TimerTask() {
@Override
public void run() {
r.run();
}
};
}
Damit geht es dann wesentlich kürzer und schöner:
test.schedule(wrap(() -> System.out.println("Every second")), 0, 1000);
// Referenz einer statischen Methode mit Klasse::Methode
// Referenz einer Instanzmethode Objekt::Methode oder this::Methode
test.schedule(wrap(Klasse::printExample), 0, 1000);
//Die Methode für das zweite Beispiel
private static void printExample() {
System.out.println("Also every second");
}
Hier ein Antwortversuch. Ein "Thread" (deutsch Faden) ist eine Art Hintergrundprozess (genauer ein Hintergrundprozess, der den selben Speicherbereich wie das Hauptprogramm nutzt).
Damit lässt sich ein "Timer" gut implementieren. Beachte vor allem die Methode "run()", welche so heißen muss:
package timer;
public class Timer implements Runnable {
// Tausend Millisekunden = eine Sekunde
public static final int SEKUNDE = 1000;
public static void main(String[] args) {
new Timer().top();
}
void tuEtwas() {
System.out.println("etwas");
}
void top() {
starteTimer();
}
Thread faden;
boolean laeuft;
void starteTimer() {
faden = new Thread (this);
laeuft = true;
faden.start();
}
public void stop() {
laeuft = false;
}
@Override
public void run() {
while(laeuft) {
tuEtwas();
try {
Thread.sleep(SEKUNDE);
} catch (InterruptedException ie) {
System.out.println("Tread wurde unterbrochen");
stop();
}
}
}
} // end of class Timer
Ich hab https://docs.oracle.com/javase/9/docs/api/java/util/Timer.html schon mehrfach gesehen, ich blick das nur nicht wirklich