Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
Vorwort
1 Java ist auch eine Sprache
2 Sprachbeschreibung
3 Klassen und Objekte
4 Der Umgang mit Zeichenketten
5 Mathematisches
6 Eigene Klassen schreiben
7 Angewandte Objektorientierung
8 Exceptions
9 Die Funktionsbibliothek
10 Threads und nebenläufige Programmierung
11 Raum und Zeit
12 Datenstrukturen und Algorithmen
13 Dateien und Datenströme
14 Die eXtensible Markup Language (XML)
15 Grafische Oberflächen mit Swing
16 Grafikprogrammierung
17 Netzwerkprogrammierung
18 Verteilte Programmierung mit RMI und Web-Services
19 JavaServer Pages und Servlets
20 Applets
21 Midlets und die Java ME
22 Datenbankmanagement mit JDBC
23 Reflection und Annotationen
24 Logging und Monitoring
25 Sicherheitskonzepte
26 Java Native Interface (JNI)
27 Dienstprogramme für die Java-Umgebung
A Die Begleit-DVD
Stichwort
Download: - ZIP, ca. 12,5 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> /Java-Insel | vor >>
Java ist auch eine Insel von Christian Ullenboom Programmieren mit der Java Standard Edition Version 6
Java ist auch eine Insel 7., aktualisierte Auflage geb., mit DVD (November 2007) 1.492 S., 49,90 Euro Galileo Computing ISBN 978-3-8362-1146-8 |
| 10 Threads und nebenläufige Programmierung
|  | 10.1 Nebenläufigkeit
|  |  | 10.1.1 Threads und Prozesse
|  |  | 10.1.2 Wie parallele Programme die Geschwindigkeit steigern können
|  |  | 10.1.3 Was Java für Nebenläufigkeit alles bietet
|  | 10.2 Threads erzeugen
|  |  | 10.2.1 Threads über die Schnittstelle Runnable implementieren
|  |  | 10.2.2 Thread mit Runnable starten
|  |  | 10.2.3 Der Name eines Threads
|  |  | 10.2.4 Die Klasse Thread erweitern
|  |  | 10.2.5 Wer bin ich?
|  | 10.3 Die Zustände eines Threads
|  |  | 10.3.1 Threads schlafen
|  |  | 10.3.2 Mit yield() auf Rechenzeit verzichten
|  |  | 10.3.3 Das Ende eines Threads
|  |  | 10.3.4 UncaughtExceptionHandler für unbehandelte Ausnahmen
|  |  | 10.3.5 Einen Thread höflich mit Interrupt beenden
|  |  | 10.3.6 Der stop() von außen und die Rettung mit ThreadDeath
|  |  | 10.3.7 Ein Rendezvous mit join()
|  |  | 10.3.8 Barrier und Austausch mit Exchanger
|  |  | 10.3.9 Arbeit niederlegen und wieder aufnehmen
|  |  | 10.3.10 Priorität
|  |  | 10.3.11 Der Thread ist ein Dämon
|  | 10.4 Der Ausführer (Executor) kommt
|  |  | 10.4.1 Die Schnittstelle Executor
|  |  | 10.4.2 Die Thread-Pools
|  |  | 10.4.3 Threads mit Rückgabe über Callable
|  |  | 10.4.4 Mehrere Callable abarbeiten
|  |  | 10.4.5 Mit ScheduledExecutorService wiederholende Ausgaben und Zeitsteuerungen
|  | 10.5 Synchronisation über kritische Abschnitte
|  |  | 10.5.1 Gemeinsam genutzte Daten
|  |  | 10.5.2 Probleme beim gemeinsamen Zugriff und kritische Abschnitte
|  |  | 10.5.3 Punkte parallel initialisieren
|  |  | 10.5.4 i++ sieht atomar aus, ist es aber nicht
|  |  | 10.5.5 Kritische Abschnitte schützen
|  |  | 10.5.6 Schützen mit ReentrantLock
|  |  | 10.5.7 Synchronisieren mit synchronized
|  |  | 10.5.8 Synchronized-Methoden der Klasse StringBuffer
|  |  | 10.5.9 Mit synchronized synchronisierte Blöcke
|  |  | 10.5.10 Dann machen wir doch gleich alles synchronisiert!
|  |  | 10.5.11 Lock-Freigabe im Fall von Exceptions
|  |  | 10.5.12 Mit synchronized nachträglich synchronisieren
|  |  | 10.5.13 Monitore sind reentrant – gut für die Geschwindigkeit
|  |  | 10.5.14 Synchronisierte Methodenaufrufe zusammenfassen
|  |  | 10.5.15 Deadlocks
|  | 10.6 Synchronisation über Warten und Benachrichtigen
|  |  | 10.6.1 Die Schnittstelle Condition
|  |  | 10.6.2 Beispiel: Erzeuger-Verbraucher-Programm
|  |  | 10.6.3 Warten mit wait() und Aufwecken mit notify()
|  |  | 10.6.4 Falls der Lock fehlt: IllegalMonitorStateException
|  |  | 10.6.5 Semaphor
|  | 10.7 Atomare Operationen und frische Werte mit volatile
|  |  | 10.7.1 Der Modifizierer volatile bei Objekt-/Klassenvariablen
|  |  | 10.7.2 Das Paket java.util.concurrent.atomic
|  | 10.8 Mit dem Thread verbundene Variablen
|  |  | 10.8.1 ThreadLocal
|  |  | 10.8.2 InheritableThreadLocal
|  | 10.9 Gruppen von Threads in einer Thread-Gruppe
|  |  | 10.9.1 Aktive Threads in der Umgebung
|  |  | 10.9.2 Etwas über die aktuelle Thread-Gruppe herausfinden
|  |  | 10.9.3 Threads in einer Thread-Gruppe anlegen
|  |  | 10.9.4 Methoden von Thread und ThreadGroup im Vergleich
|  | 10.10 Zeitgesteuerte Abläufe
|  |  | 10.10.1 Die Klassen Timer und TimerTask
|  |  | 10.10.2 Job-Scheduler Quartz
|  | 10.11 Einen Abbruch der virtuellen Maschine erkennen
|  | 10.12 Zum Weiterlesen
## 10.10 Zeitgesteuerte Abläufe Ein Scheduler arbeitet Programmstücke nach einer festen Zeitspanne oder zu einem fixen Zeitpunkt einmal oder wiederholt ab. Notwendigkeiten für Scheduling gibt es insbesondere im Enterprise-Bereich häufig: In regelmäßigen Abständen müssen Reports erstellt werden, temporäre Daten sollen verschwinden und so weiter. Zwei Scheduling-Technologien sollen kurz vorgestellt werden: die einbauten java.util.Timer; das Scheduling-Framework Quartz. ### 10.10.1 Die Klassen Timer und TimerTask Die Implementierung von zeitgesteuerten Abläufen nimmt uns zum Teil die Java-Bibliothek ab, die dazu die Klassen java.util.Timer und java.util.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. Unser TimerTask soll einfach einen Text auf dem Bildschirm ausgeben: Listing 10.34 com/tutego/insel/thread/timer/TimerTaskDemo.java, Task
    class Task extends TimerTask
    {
      @Override public void run()
      {
        System.out.println( "Make my day." );
      }
    }
Hier klicken, um das Bild zu vergrößern 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 10.35 com/tutego/insel/thread/timer/TimerTaskDemo.java, TimerTaskDemo
    public class TimerTaskDemo
    {
      public static void main( String[] args )
      {
        Timer timer = new Timer();

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

        // nach einer Sekunde geht’s los und dann alle fünf 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.
Hinweis Insgesamt gibt es drei Timer in Java: java.util.Timer, javax.management.timer.Timer und javax.swing.Timer. Der Management-Timer ist eine TimerMBean und als Managed Bean mit einer ganz besonderen Schnittstelle für Außenstehende zugänglich. Der Swing-Timer führt hingegen keine Task-Objekte aus, sondern ActionListener.
### 10.10.2 Job-Scheduler Quartz 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. Quartz kann den Zustand der Jobs in einem JobStore speichern, etwa in einer Datenbank (JDBCJobStore), sodass 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() 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 unter http://www.onjava.com/lpt/a/4637. ### Ihr Kommentar Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.
Name |
E-Mail |
Ihr Kommentar |
<< zurück | <top> | vor >>

Copyright © Galileo Press 2008
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, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de