Galileo Computing < openbook >
Galileo Computing - Programming the Net
Galileo Computing - Programming the Net


Java ist auch eine Insel (2. Aufl.) von Christian Ullenboom
Programmieren für die Java 2-Plattform in der Version 1.4
Java ist auch eine Insel (2. Auflage)
gp Kapitel 9 Threads und nebenläufige Programmierung
  gp 9.1 Prozesse und Threads
  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 Threads schlafen
    gp 9.3.1 Eine Zeituhr
  gp 9.4 Die Klassen Timer und TimerTask
  gp 9.5 Die Zustände eines Threads
    gp 9.5.1 Das Ende eines Threads
    gp 9.5.2 Einen Thread höflich mit Interrupt beenden
    gp 9.5.3 Der stop() von außen
    gp 9.5.4 Das ThreadDeath-Objekt
    gp 9.5.5 Auf das Ende warten mit join()
  gp 9.6 Arbeit niederlegen und wieder aufnehmen
  gp 9.7 Priorität
    gp 9.7.1 Threads hoher Priorität und das AWT
    gp 9.7.2 Granularität und Vorrang
  gp 9.8 Dämonen (engl. Daemon)
  gp 9.9 Kooperative und nicht kooperative Threads
  gp 9.10 Synchronisation über kritische Abschnitte
    gp 9.10.1 Gemeinsam genutzte Daten
    gp 9.10.2 Probleme beim gemeinsamen Zugriff und kritische Abschnitte
    gp 9.10.3 Punkte parallel initialisieren
    gp 9.10.4 i++ sieht atomar aus, ist es aber nicht
    gp 9.10.5 Abschnitte mit synchronized schützen
    gp 9.10.6 Monitore
    gp 9.10.7 Synchronized-Methode am Beispiel der Klasse StringBuffer
    gp 9.10.8 Synchronisierte Blöcke
    gp 9.10.9 Vor- und Nachteile von synchronisierten Blöcken und Methoden
    gp 9.10.10 Nachträglich synchronisieren
    gp 9.10.11 Monitore sind reentrant, gut für die Geschwindigkeit
    gp 9.10.12 Deadlocks
  gp 9.11 Variablen mit volatile kennzeichnen
  gp 9.12 Synchronisation über Warten und Benachrichtigen
    gp 9.12.1 Warten mit wait() und Aufwecken mit notify()
    gp 9.12.2 Mehrere Wartende und notifyAll()
    gp 9.12.3 wait() mit einer Zeitspanne
    gp 9.12.4 Beispiel Erzeuger-Verbraucher-Programm
    gp 9.12.5 Semaphoren
  gp 9.13 Grenzen von Threads
  gp 9.14 Aktive Threads in der Umgebung
  gp 9.15 Gruppen von Threads in einer Thread-Gruppe
    gp 9.15.1 Etwas über die aktuelle Thread-Gruppe herausfinden
    gp 9.15.2 Threads in einer Thread-Gruppe anlegen
    gp 9.15.3 Methoden von Thread und ThreadGroup im Vergleich
  gp 9.16 Einen Abbruch der virtuellen Maschine erkennen


Galileo Computing

9.3 Threads schlafen  downtop

Manchmal ist es notwendig, einen Thread für eine bestimmte Zeit anzuhalten. Dazu dient die überladende Klassenfunktion sleep(). Etwas erstaunlich ist sicherlich, dass das keine Objektfunktion ist, die jedes Thread-Objekt anbietet, sondern eine statische Funktion. Ein Grund wird sein, dass dadurch verhindert wird, externe Threads zu beeinflussen. Es ist nicht möglich, einen fremden Thread, dessen Referenz wir haben, einfach ein paar Sekunden schlafen zu legen.

class java.lang.Thread
implements Runnable

gp  static void sleep( long millis ) throws InterruptedException
Der aktuell ausgeführte Thread wird mindestens millis Millisekunden eingeschläfert. Unterbricht ein anderer Thread den schlafenden, so wird vorzeitig eine Interrupted Exception ausgelöst.
gp  static void sleep( long millis, int nanos ) throws InterruptedException
Der aktuell ausgeführte Thread wird mindestens millis Millisekunden und zusätzlich nanos Nanosekunden eingeschläfert. Im Gegensatz zu sleep(long) wird bei einer negativen Millisekundenanzahl eine IllegalArgumentException ausgelöst, ebenso wird diese Exception ausgelöst, wenn die Nanosekundenanzahl nicht zwischen 0 und 999999 liegt.
Beispiel   Die Applikation soll 2 Sekunden lang schlafen.
try {
  Thread.sleep( 2000 );
} catch ( InterruptException e ) { }

Die Unterbrechung sitzt in einem zwingenden try/catch-Block, da eine Exception ausgelöst wird, wenn der Thread unterbrochen wird.

Praktisch wird das Erweitern der Klasse Thread bei inneren anonymen Klassen. Die folgende Klasse SleepInInnerClass gibt nach zwei Sekunden Schlafzeit eine Meldung auf dem Bildschirm aus. Wir starten den Thread dabei aus dem Objekt-Initialisierungsblock. Natürlich hätten wir auch direkt auf der anonymen Unterklasse die Methode start() aufrufen können.

Listing 9.3   SleepInInnerClass.java

public class SleepInInnerClass
{
  public static void main( String args[] )
  {
    new Thread() {
      { start(); } public void run() {
        try { sleep(2000); System.out.println("Zeit ist um."); }
        catch ( InterruptedException e ) { }
      } };
  }
}

Galileo Computing

9.3.1 Eine Zeituhr  toptop

Die sleep()-Methode kann auch effektiv zum Warten benutzt werden. Soll ein Programm zu einer bestimmten Zeit eine Aufgabe ausführen, beispielsweise um 18 Uhr eine Nachricht senden, wenn die Simpsons im Fernsehen laufen, so kann ein Thread eingesetzt werden.

Listing 9.4   Clock.java

import java.util.*;
import java.text.*;

class Clock extends Thread
{
  Calendar cal = new GregorianCalendar();

   public Clock( int timeHour, int timeMinute, String title )
  {
    wakeHour = timeHour;
    wakeMinute = timeMinute;
    this.title = title;

    start();
  }

  public Clock( int timeHour, String title )
  {
    this ( timeHour, 0, title );
  }

  public void run()
  {
    boolean checked = false;

    while ( true )
    {
      try
      {
        cal.setTime( new Date() );

        if ( cal.get( Calendar.HOUR_OF_DAY ) == wakeHour &&
             cal.get( Calendar.MINUTE ) == wakeMinute )
        {
          if ( !checked )
          {
            // hier nun Arbeit verrichten
            System.out.println( title );

            checked = true;
          }
        }
        Thread.sleep( 1000*10 );   // 10 Sekunden schlafen
      }
      catch ( InterruptedException e ) {};
    }
  }

  private int wakeHour, wakeMinute;
  private String title;

  public static void main( String args[] )
  {
    Clock clock = new Clock( 18, "Simpsons kommt" );
  }
}




Copyright © Galileo Press GmbH 2003
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