Galileo Computing < openbook > Galileo Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger

Java ist auch eine Insel von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 5 (Tiger-Release)
Buch: Java ist auch eine Insel
gp Kapitel 9 Threads und nebenläufige Programmierung
  gp 9.1 Prozesse und Threads
    gp 9.1.1 Wie parallele Programme die Geschwindigkeit steigern können
  gp 9.2 Threads erzeugen
    gp 9.2.1 Threads über die Schnittstelle Runnable implementieren
    gp 9.2.2 Threads über Runnable starten
    gp 9.2.3 Die Klasse Thread erweitern
    gp 9.2.4 Erweitern von Thread oder Implementieren von Runnable?
  gp 9.3 Die Zustände eines Threads
    gp 9.3.1 Das Ende eines Threads
    gp 9.3.2 Einen Thread höflich mit Interrupt beenden
    gp 9.3.3 Der stop() von außen
    gp 9.3.4 Das ThreadDeath-Objekt
    gp 9.3.5 Auf das Ende warten mit join()
    gp 9.3.6 Threads schlafen
    gp 9.3.7 Eine Zeituhr
  gp 9.4 Arbeit niederlegen und wieder aufnehmen
  gp 9.5 Priorität
    gp 9.5.1 Threads hoher Priorität und das AWT
    gp 9.5.2 Granularität und Vorrang
  gp 9.6 Dämonen
  gp 9.7 Kooperative und nichtkooperative Threads
  gp 9.8 Synchronisation über kritische Abschnitte
    gp 9.8.1 Gemeinsam genutzte Daten
    gp 9.8.2 Probleme beim gemeinsamen Zugriff und kritische Abschnitte
    gp 9.8.3 Punkte parallel initialisieren
    gp 9.8.4 i++ sieht atomar aus, ist es aber nicht
    gp 9.8.5 Abschnitte mit synchronized schützen
    gp 9.8.6 Monitore
    gp 9.8.7 Synchronized-Methode am Beispiel der Klasse StringBuffer
    gp 9.8.8 Synchronisierte Blöcke
    gp 9.8.9 Vor- und Nachteile von synchronisierten Blöcken und Methoden
    gp 9.8.10 Nachträglich synchronisieren
    gp 9.8.11 Monitore sind reentrant, gut für die Geschwindigkeit
    gp 9.8.12 Deadlocks
    gp 9.8.13 Erkennen von Deadlocks
  gp 9.9 Synchronisation über Warten und Benachrichtigen
    gp 9.9.1 Warten mit wait() und Aufwecken mit notify()
    gp 9.9.2 Falls der Lock fehlt: IllegalMonitorStateException
    gp 9.9.3 Mehrere Wartende und notifyAll()
    gp 9.9.4 wait() mit einer Zeitspanne
    gp 9.9.5 Beispiel Erzeuger-Verbraucher-Programm
    gp 9.9.6 Semaphoren
  gp 9.10 Atomares und frische Werte mit volatile
    gp 9.10.1 Das Paket java.util.concurrent.atomic
  gp 9.11 Aktive Threads in der Umgebung
  gp 9.12 Gruppen von Threads in einer Thread-Gruppe
    gp 9.12.1 Etwas über die aktuelle Thread-Gruppe herausfinden
    gp 9.12.2 Threads in einer Thread-Gruppe anlegen
    gp 9.12.3 Methoden von Thread und ThreadGroup im Vergleich
  gp 9.13 Die Klassen Timer und TimerTask
    gp 9.13.1 Job-Scheduler Quartz
  gp 9.14 Einen Abbruch der virtuellen Maschine erkennen


Galileo Computing

9.13 Die Klassen Timer und TimerTasdowntop

Die Implementierung von zeitgesteuerten Abläufen nimmt uns zum Teil die Java-Bibliothek ab, die dazu die Klassen Timer und TimerTask anbietet. Sie helfen bei der zeitgesteuerten Ausführung. Ein TimerTask ist eine Klasse, die uns Runnable implementieren lässt und Operationen umfasst, die zu einem Zeitpunkt oder in einer beliebigen Wiederholung ausgeführt werden sollen. Ein TimerTask wird dann einer Timer-Klasse übergeben, die den dazugehörigen Verwaltungs-Thread startet.


Beispiel   Text auf dem Bildschirm ausgeben

Listing 9.18   TimerTaskDemo.java, Teil 1


import java.util.*;

class Task   extends TimerTask  
{
    public void run()  
  {
    System.out.println( "Make my day." );
  }
}

Jetzt müssen wir nur noch dieses TimerTask-Objekt erzeugen und eine der Objektmethoden von Timer übergeben. In unserem Beispiel soll unser Text zwei Sekunden nach dem Eintragen auf dem Bildschirm ausgegeben werden und in einem zweiten Fall – nach einer Wartesekunde – alle fünf Sekunden.

Listing 9.19   TimerTaskDemo.java, Teil 2


public class TimerTaskDemo
{
  public static void main( String args[] )
  {
    Timer timer = new Timer();

    // nach 2 Sek geht’s los
      timer.schedule  ( new Task(), 2000 );

    // nach 1 Sek geht’s los und dann alle 5 Sekunden
      timer.schedule  ( new Task(), 1000, 5000 );
  }
}

Die schedule()-Methode gibt es in vier Ausführungen. Dazu kommen zwei Methoden scheduleAtFixedRate(), die versuchen, die Genauigkeit zu verbessern. Dies lohnt sich bei Operationen, die über einen langen Zeitraum präziser ohne Drift ausgeführt werden sollen, wie es etwa bei einer Uhr gilt, die jede Stunde ihren großen Zeiger bewegt. Selbst wenn Hintergrundoperationen, wie Garbage-Collection, die pünktliche Ausführung der Operation verhindern, wird die Verspätung bis zur nächsten Wiederholung aufgeholt.

Ein Timer kann abgebrochen werden, wenn die cancel()-Methode aufgerufen wird.


Galileo Computing

9.13.1 Job-Scheduler Quartz  toptop

Der OpenSymphony Quartz Scheduler (http://www.opensymphony.com/quartz/) ist ein hochwertiger Job-Scheduler, der Aufgaben (Jobs), zu bestimmten Zeiten (hier kommt die java.util.Calendar-Klasse ins Spiel) und in gegebener Regelmäßigkeit durchführen kann. Die java.util.Timer-Klasse bietet nur die Angabe einer Startzeit und eines Wiederholungsintervalls. Der Zustand der Jobs kann Quartz speichern (JobStore), etwa in einer Datenbank (JDBCJobStore), so dass auch nach einem unrühmlichen Ende die Jobs wieder gestartet und weitergeführt werden können. Die Timer-Klasse kann das nicht! Quartz und der Timer sprechen ihre Jobs durch eine Schnittstelle an, bei Quartz heißt sie Job und die Callback-Funktion execute() – sie ruft der Scheduler zu vorgegebenen Zeiten auf. Die zentrale ausführende Einheit erfragt eine Fabrikfunktion:


SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
Scheduler sched = schedFact.getScheduler();

Die Funktion sched.start() startet schließlich den Scheduler. Mit scheduleJob() lässt sich ein Job zusammen mit einem Trigger – das ist eine Beschreibung der Zeitparameter – starten. Eine Dokumentation findet sich auf der Homepage der Bibliothek und auch bei http://www.onjava.com/lpt/a/4637.





Copyright © Galileo Press GmbH 2004
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


[Galileo Computing]

Galileo Press GmbH, Gartenstraße 24, 53229 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de