Wie macht man einen Timer(Java)?

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.


OtakuTrojaner 
Fragesteller
 12.01.2018, 14:31

Ich hab https://docs.oracle.com/javase/9/docs/api/java/util/Timer.html schon mehrfach gesehen, ich blick das nur nicht wirklich

0
FireEraser  13.01.2018, 00:18
@OtakuTrojaner

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");
}
0

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