16.11.2013 Aufrufe

Programmieren in Java - HostFiXX.de

Programmieren in Java - HostFiXX.de

Programmieren in Java - HostFiXX.de

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

<strong>Programmieren</strong> <strong>in</strong> <strong>Java</strong><br />

Anweisungen ist. Sobald E erfüllt ist, wird S exklusiv von e<strong>in</strong>em e<strong>in</strong>zigen Thread<br />

ausgeführt.<br />

public class ClassMitGur<strong>de</strong>dSuspension<br />

{<br />

…<br />

private synchronized void awaitConditionE()<br />

{<br />

while (!E)<br />

{<br />

try {<br />

wait();<br />

}<br />

catch (InterruptedException ex) { }<br />

}<br />

}<br />

public void synchronized guar<strong>de</strong>dStatementS<br />

{<br />

awaitConditionE();<br />

S<br />

}<br />

}<br />

Die folgen<strong>de</strong>n Metho<strong>de</strong>n <strong>de</strong>r Klasse Object übernehmen "Wächter"-Funktionen:<br />

public f<strong>in</strong>al void wait()<br />

throws InterruptedException<br />

public f<strong>in</strong>al void wait(long timeout)<br />

throws InterruptedException<br />

public f<strong>in</strong>al void wait(long timeout,<strong>in</strong>t nanos) throws InterruptedException<br />

- Der aktuelle Thread wird auf wartend gesetzt und <strong>in</strong> e<strong>in</strong>en mit <strong>de</strong>m Objekt verknüpften Wartebereich<br />

gestellt<br />

- Der exklusive Zugriff, <strong>de</strong>n <strong>de</strong>r Thread hat, wird freigegeben. Das ist Voraussetzung dafür, dass<br />

an<strong>de</strong>re Threads überhaupt notify() bzw. notifyAll() aufrufen können.<br />

- Es existiert noch die Möglichkeit bei wait() die maximale Wartezeit anzugeben. Ist diese<br />

verstrichen, dann wird automatisch für diesen Thread wie bei notify() verfahren.<br />

public f<strong>in</strong>al void notify()<br />

- Wenn warten<strong>de</strong> Threads existieren, dann wird nicht<strong>de</strong>term<strong>in</strong>istisch e<strong>in</strong>er ausgewählt und dieser aus<br />

<strong>de</strong>m Wartebereich entfernt<br />

- Der ausgewählte Thread versucht Zugriff auf das Objekt zu bekommen. Der ausgewählte Thread<br />

kann <strong>de</strong>n Zugriff nur dann bekommen, wenn <strong>de</strong>r Thread <strong>de</strong>r notify() aufgerufen hat und noch im<br />

Besitz <strong>de</strong>s Zugriffs, diesen freigibt, und ke<strong>in</strong> an<strong>de</strong>rer Thread <strong>de</strong>n Zugriff erhält.<br />

- Erhält <strong>de</strong>r ausgewählte Thread später <strong>de</strong>n Zugriff, dann setzt er die Ausführung mit <strong>de</strong>m auf wait()<br />

folgen<strong>de</strong>n Co<strong>de</strong> fort.<br />

public f<strong>in</strong>al void notifyAll()<br />

- Verläuft wie notify() mit <strong>de</strong>m Unterschied, daß alle warten<strong>de</strong>n Threads aus <strong>de</strong>m Wartebereich<br />

entfernt wer<strong>de</strong>n und wie<strong>de</strong>r versuchen die Sperre zu bekommen.<br />

Nur wenn e<strong>in</strong> Thread <strong>de</strong>n exklusiven Zugriff auf e<strong>in</strong> Objekt hat, kann er <strong>de</strong>ssen<br />

wait(), notify(), o<strong>de</strong>r notifyAll() aufrufen. Ansonsten wird e<strong>in</strong>e<br />

IllegalMonitorStateException vom Laufzeitsystem erzeugt.<br />

Wenn e<strong>in</strong>e Unterbrechung während e<strong>in</strong>es wait() passiert (z.B. durch Aufruf von<br />

<strong>in</strong>terrupt() <strong>de</strong>r Klasse Thread, dann wird wie bei notify() verfahren. Die<br />

Ausführung wird aber fortgefahren mit <strong>de</strong>m Werfen e<strong>in</strong>er Ausnahme <strong>de</strong>r Klasse<br />

InterruptedException.<br />

Das Ziel ist es mit wait() auf e<strong>in</strong> Ereignis zu warten. Das Ereignis wird durch das<br />

Objekt o<strong>de</strong>r e<strong>in</strong>en Zustand <strong>de</strong>s Objekts repräsentiert. Mit notify() wird dann das<br />

E<strong>in</strong>treten <strong>de</strong>s Ereignisses mitgeteilt.<br />

Das Monitor-Konzept <strong>in</strong> <strong>Java</strong>. Zur Synchronisation nebenläufiger Prozesse hat <strong>Java</strong><br />

das Konzept <strong>de</strong>s Monitors implementiert. E<strong>in</strong> Monitor ist die Kapselung e<strong>in</strong>es<br />

kritischen Bereichs (also e<strong>in</strong>es Programmteils, <strong>de</strong>r nur von jeweils e<strong>in</strong>em Prozeß zur<br />

110

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!