JAVA Threads


Überblick

Im wesentlichen besprechen wir drei Gruppen von Routinen:

  1. con ... end: Erzeugung und Beendung von Threads:
    to = new Thread(Runnable),
    to.start(),
    to.join(), to.stop()

  2. atomic ... end: Atomare Bereiche:
    synchronized method,
    synchronized static method,
    synchronized object

  3. await cond ... end: Signale, Ereignisse
    wait(),
    notify(),
    notifyAll()


Thread Generierung

2 Möglichkeiten


Zur Implementierung des con Sprachkonstruktes müssen wir die Statements (Si) in 'Runnable' Klassen Pi packen.

     class Pi implements Runnable {
       public void run() {
       Si;
       }
     }

Damit ist con S1, S2, ... Sn end ==

      Thread t1 = new Thread(new P1());
      Thread t2 = new Thread(new P2());
      ...
      Thread tn = new Thread(new Pn());


      t1.start();
      t2.start();
      ...
      tn.start();


      t1.join();
      t2.join();
      ...
      tn.join();

Beispiel 1


Thread Synchronisation

Java Sprachkonstrukt: synchronized

3 Möglichkeiten

Probleme durch Implementierung:


Zur Implementierung des atomic Sprachkonstruktes müssen wir die Statements (S1, S2, ..., Sn) durch ein synchronized Sprachkonstrukt auf ein Objekt (z.B. atom) absichern.

     public static Object atom = new Object();

Damit ist atomic S1, S2, ... Sn end ==

     synchronized (atom) { S1, S2, ..., Sn; }
Alle Programmteile, die die internen Zustände nicht sehen sollen müssen ebenfalls synchronized verwenden.

Beispiel 2

Beispiel 5


Thread Signaling

Methoden von Java Objekten:

3 Möglichkeiten

wait() darf nur innerhalb von synchronized Programmteilen verwendet werden. Dies wird vom Compiler und vom Laufzeitsystem überwacht.


Zur Implementierung des await Sprachkonstruktes müssen wir die Arbeit auf einen Tester und einen Waiter aufteilen.

Initialization

     public static Object atom = new Object();

Damit ist await cond [ then S1, S2, ..., Sn ] end ==

Waiter:

     synchronized (atom) { 
        atom.wait();
        S1, S2, ..., Sn; 
     }

Tester:

     if ( cond ) { atom.notify(); }

An allen Programmstellen, an denen sich cond ändern könnte muß ein Tester-Teil eingefügt werden.

Semaphoren, sema.java

barrier-0.java, barrier.java, Example 6,

Weihnachtsaufgabe



[Previous] [Next] [Contents]