nullpointer.at

Timer und Timertasks – Aufgaben planen in Java


Oder wie man als Nachtwächter nicht mehr einschläft!

Achtung, dieser Blogeintrag könnte zu Konflikten mit Arbeitskollegen oder andere Personen in deinem näheren Umfeld führen! Zwinkerndes Smiley

Wer hat nicht schonmal als Nachtwächter im Museum für angewandte aber noch nicht wertvolle Kunst gearbeitet. Eine fordernde und nervenaufreibende Aufgabe! Dein Kollege hält nicht viel von Konversationen. Er sitzt neben dir mit einer Kaffeevergiftung, und wenn ihn permanent nachgefüllte Koffein nicht munter hält, dann der daraus resultierende Drang gewisse Örtlichkeiten zu – naja – inspizieren.

Während dein Kollege also im Eiltempo die Sitzgelegenheit wechselt, fasst du den Entschluss nicht so enden zu wollen. Dennoch musst du den Schlaf besiegen, um deinen Job zu behalten. Zum Glück hast du da den PC mit der Überwachungssoftware, auf dem ein JDK installiert ist. Da lässt sich sicher eine Lösung finden.

Beep!

Leider finden sich keine Sounddatein auf dem Rechner, so musst du dir selbst weiterhelfen. Daher erzeugst du einen Ton über das awt Toolkit.

import java.awt.Toolkit;

public class Beep {
	private static Beep singleton = null;
	private Toolkit defaultToolkit;

	public static Beep getInstance() {
		if (singleton == null) {
			singleton = new Beep();
		}
		return singleton;
	}

	private Beep() {
		this.defaultToolkit = Toolkit.getDefaultToolkit();
	}

	public void beep() {
		this.defaultToolkit.beep();
	}

	public static void main(String args[]) {
		Beep b = Beep.getInstance();
		b.beep();
	}

}

Jetzt hast du bereits ein Geräusch das dich munter halten kann, dein Kollege schaut dich schon verwundert an, nimmt einen Schluck Kaffee und beschließt dich wieder zu ignorieren. Doch wie schaffst du nun dass das Programm die ganze Schicht lang der Störfaktor ist, den du dir erhoffst? Die Rechte es als regelmäßiges Service laufen zu lassen hast du im Betriebssystem nicht. Aber auch hier gibt es dank Java einen Ausweg:

Timer und TimerTask

Diese wurden geschaffen um zeitgesteuerte Abläufe zu vereinfachen. TimerTask lässt uns Runnable, also einen eigenen Thread, implementieren und umfasst alle Geschehnisse die auszuführen sind. Timer hingegen bekommt den TimerTask übergeben und sorgt für dessen Ausführung in einem Verwaltungsthread.

import java.util.Timer;
import java.util.TimerTask;

public class KeepMeAwake {

	/**
	 * Schedules an annoying beep every 5 seconds to keep us awake
	 *
	 * @param args
	 */
	public static void main(String[] args) {

		TimerTask action = new TimerTask() {
			public void run() {
				Beep b = Beep.getInstance();
				b.beep();
			}

		};

		Timer caretaker = new Timer();
		caretaker.schedule(action, 1000, 5000);

	}
}

Als erstes wird ein TimerTask erzeugt, indem wir unser vorheriges Beep Objekt nutzen um das Geräusch wiederzugeben. Diesen Task starten wir dann in einem Timer. Dabei beginnen wir mit der Lärmattacke eine Sekunde nach starten des Programms, und lassen uns dann alle 5 Sekunden neu beschallen. Ob das unserem Kollegen gefällt? Egal, uns hält es munter.

Hier noch eine kurze Erklärung zur Timer Klasse:

Die Klasse Timer bietet 4 verschiedene schedule Methoden

  • schedule(TimerTask task, Date time) – startet einen Task zu einem gewissen Zeitpunkt
  • schedule(TimerTask task, long delay) – startet einen Task nach einer angegebenen Anzahl von Millisekunden
  • schedule(TimerTask task, Date firsttime, long period) – startet einen Task zu einem fixen Zeitpunkt und wiederholt ihn dann nach der zusätzlich angegebenen Anzahl von Millisekunden regelmäßig
  • schedule(TimerTask task, long delay, long period) – startet einen Task nach einer angegebenen Anzahl von Millisekunden und wiederholt ihn dann nach der zusätzlich angegebenen Anzahl von Millisekunden regelmäßig

Die letzten beiden Varianten gibt es noch zusätzlich als scheduleAtFixedRate Methoden, die sich um eine exaktere Ausführung bemühen. Dies ist notwendigk so Operationen über einen langen Zeitraum im exakt den gleichbleibenden Intervall ausgeführt werden müssen.

Ein gestarteter Timer kann dann mittels der Methode cancel() wieder beendet werden, wenn er nicht mehr gebraucht wird.

Eine feiner steuerbare Alternative ist der Quartz-Scheduler http://www.quartz-scheduler.org/ Dieser ist freilich Open Source und unter der Apache 2.0 Lizenz nutzbar. Er lässt eine Steuerung von variablen Ausführzeiten und ähnlichem zu und bietet daher ein breiteres Einsatzspektrum. Wenn euch das Thema interessiert, schaut euch diesen doch mal genauer an.

In diesem Sinne – dreht die Lautsprecher voll auf!

Ähnliche Artikel:


Beitrag veröffentlicht

in

,

von

Kommentare

6 Antworten zu „Timer und Timertasks – Aufgaben planen in Java“

  1. Avatar von Chris
    Chris

    Hallo,
    Gesucht und beim ersten klick gefunden, Vielen Dank

  2. Avatar von Senas
    Senas

    im Programmcode-Abschnitt von Timer und TimerTask Zeile 16, behauptet mein Compiler, es würde eine identifier hinter b.beep benötigt werden. Ja, die Klammer habe ich nicht vergessen.
    Kann das an der neuen Version von Java liegen (Java 1.7.0_17)

    Ansonsten, ein sehr schön umschriebenes Beispiel.

    1. Avatar von Pummer Thomas

      Hi, ich habe eben das Beispiel unter Java 1.7.0_21 laufen lassen. Es hat bei mir problemlos compiliert. Haben Sie es in der zwischenzeit zum Laufen bekommen?
      Wenn nicht, ich habe für Sie auf Github die Sourcen zum Download bereitgestellt. Gerne können SIe mir auch Ihren Source z.B. über Gist zukommen lassen und ich werfe einen Blick darauf.
      Schöne Grüße

  3. Avatar von David Furer
    David Furer

    Guten Tag
    Ich arbeite an einem projekt welches solche TimerTask’s über Tage hinweg dürchführen soll.
    Es funktioniert bestens, jedoch jeweils nach ca 4 Tagen Laufzeit bekomme ich einen Java heap memory error.
    In VisualVM ist sichtbar dass der Speicher langsam aber stetig steigt.
    Manuelles aufrufen Sytem.gc() habe ich schon drin, aber das räumt nicht sauber genug auf…

    Haben Sie noch eine Idee?

  4. Avatar von Maximator
    Maximator

    Wie siehts aus mit nem Befehl mit dem ich den Timer auch wieder stoppen kann? Gibt’s da ne Möglichkeit? Bei anderen timern funktioniert das mit timer.cancel() aber hier weiß ich leider nicht was der „timer“ der gecancelt wird in diesem Code ist.

  5. Avatar von Marcelooooo
    Marcelooooo

    @Maximator
    Ich bin ein kompletter Noob, meine Lösung könnnte also auch furchtbar sein, hat aber bei mir funktioniert: :D

    public void run()

    if( //wenn die Schicht aus ist bzw. Endbedingung für den Timer)
    {
    cancel();
    }
    else{
    Beep b = Beep.getInstance();
    b.beep();
    }
    }

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*