Im wesentlichen besprechen wir drei Gruppen von Routinen:
to = new Thread(Runnable)
, to.start()
, to.join()
, to.stop()
synchronized method
, synchronized static method
, synchronized object
wait()
, notify()
, notifyAll()
Thread
Klasse
Runnable
Interface
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();
synchronized
3 Möglichkeiten
synchronized (Object) { statements }
synchronized method
synchronized static method
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.
3 Möglichkeiten
wait()
Warten bis zum Signal
notify()
abgeben eines Signals an einen Thread
notifyAll()
abgeben eines Signals an alle Threads
wait()
Varianten mit Zeitlimit
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.
barrier-0.java, barrier.java, Example 6,
[Previous] [Next] [Contents]