Timer und Timertasks – Aufgaben planen in Java

Hier wird gezeigt wie man mit den Klassen Timer & Timertasks zukünftige und/oder regelmäßige Aufgabenoder bequem umsetzen kann.

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: