63
public class C ... package a.b.c; import a.d.*; /home/seidl/java/a/b/c /home/seidl/java/a/b /home/seidl/java/a/d class A ... package a; package a.b; public class B ... import a.b.B; /home/seidl/java/a import a.d.*; import a.b.c.C; public class D ... package a.d; 682

package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

  • Upload
    others

  • View
    9

  • Download
    0

Embed Size (px)

Citation preview

Page 1: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

public class C ...

package a.b.c;import a.d.*;

/home/seidl/java/a/b/c

/home/seidl/java/a/b /home/seidl/java/a/d

class A ...

package a;

package a.b;

public class B ...

import a.b.B;

/home/seidl/java/a import a.d.*;import a.b.c.C;

public class D ...

package a.d;

682

Page 2: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Achtung:

• Jede Klasse eines Pakets, die in einer Klasse außerhalb des

Pakets benutzt werden soll, muss als publi gekennzeichnetwerden.

• Jede Datei darf zwar mehrere Klassen-Definitionen enthalten,

aber nur eine einzige, die publi ist.• Der Name der öffentlichen Klasse muss mit demjenigen der

Datei übereinstimmen ... :-)

• Der Paket-Name enthält den gesamten absoluten Zugriffs-Pfad

von demWurzel-Paket.

• Abhängigkeiten zwischen Paketen können zirkulär sein.

683

Page 3: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Im Verzeichnis a lässt sich das Programm compilieren. Allerdingsliefert ...

> java AEx eption in thread "main" java.lang.NoClassDefFoundError: a/A (wrong name: A)at java.lang.ClassLoader.defineClass0(Native Method)at java.lang.ClassLoader.defineClass(Compiled Code)at java.se urity.Se ureClassLoader.defineClass(Compiled Code)at java.net.URLClassLoader.defineClass(Compiled Code)at java.net.URLClassLoader.a ess$1(Compiled Code)at java.net.URLClassLoader$1.run(Compiled Code)at java.se urity.A essController.doPrivileged(Native Method)at java.net.URLClassLoader.findClass(Compiled Code)at java.lang.ClassLoader.loadClass(Compiled Code)at sun.mis .Laun her$AppClassLoader.loadClass(Compiled Code)at java.lang.ClassLoader.loadClass(Compiled Code)684

Page 4: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Aufruf von java a.A ist schon besser:> java a.AEx eption in thread "main" java.lang.NoClassDefFoundError: a/AAufruf von java a.A ein Verzeichnis oberhalb von a liefert dagegen:> java a.Aa.b. .C�67bb4 68 a.d.D�69df4 68

685

Page 5: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Der Grund:

• Damit Java Verzeichnisse mit Paketen findet, sollte die

Umgebungsvariable CLASSPATH gesetzt werden, z.B. hiermithilfe des Kommandos:export CLASSPATH=~/java:.

• Diese Variable enthält die Start-Verzeichnisse, in denen bei

einem Aufruf nach Klassen oder Paketen gesucht wird.

• Bei einem Aufruf > java A durchsucht das Laufzeit-System

sämtliche in CLASSPATH angegebenen Verzeichnisse nach einerDatei A. lass und führt diese aus ( – sofern sie vorhanden ist).

• Bei einem Aufruf > java a.b.c.A sucht das Laufzeit-System

eine Datei A. lass in Unterverzeichnissen a/b/c vonVerzeichnissen aus CLASSPATH.

• Voreingestellt ist das aktuelle Verzeichnis, d.h.: CLASSPATH=.686

Page 6: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

a

b

c

d

CLASSPATH

Verzeichnis-Baum

687

Page 7: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

21 Threads

• Die Ausführung eines Java-Programms besteht in Wahrheit

nicht aus einem, sondern mehreren parallel laufenden Threads.

• Ein Thread ist ein sequentieller Ausführungs-Strang.

• Der Aufruf eines Programms startet einen Thread main, der dieMethode main() des Programms ausführt.

• Ein weiterer Thread, den das Laufzeitsystem parallel startet, ist

die Garbage Collection.

• Die Garbage Collection soll mittlerweile nicht mehr erreichbare

Objekte beseitigen und den von ihnen belegten Speicherplatz

der weiteren Programm-Ausführung zur Verfügung stellen.

688

Page 8: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

main

main() main()

main

f()main()

main

f()main()

main

689

Page 9: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

main

main()

gc gc

main()

main

f()main()

main

f()main()

main

690

Page 10: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

• Mehrere Threads sind auch nützlich, um

• ... mehrere Eingabe-Quellen zu überwachen (z.B.

Mouse-Klicks und Tastatur-Eingaben) ↑Graphik;

• ... während der Blockierung einer Aufgabe etwas anderes

Sinnvolles erledigen zu können;

• ... die Rechenkraft mehrerer Prozessoren auszunutzen.

• Neue Threads können deshalb vom Programm selbst erzeugt

und gestartet werden.

• Dazu stellt Java die Klasse Thread und das Interface Runnablebereit.

691

Page 11: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

main main main

Th−0 Th−0

Th−1

692

Page 12: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Beispiel:publi lass MyThread extends Thread {publi void hello(String s) {System.out.println(s);}publi void run() {hello("I'm running ...");} // end of run()publi stati void main(String[℄ args) {MyThread t = new MyThread();t.start();System.out.println("Thread has been started ...");} // end of main()} // end of lass MyThread693

Page 13: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

• Neue Threads werden für Objekte aus (Unter-) Klassen der

Klasse Thread angelegt.• Jede (konkrete) Unterklasse von Thread sollte dieObjekt-Methode publi void run(); implementieren.

• Ist t ein Thread-Objekt, dann bewirkt der Aufruf t.start();das folgende:

1. ein neuer Thread wird initialisiert;

2. die (parallele) Ausführung der Objekt-Methode run() für twird angestoßen;

3. die eigene Programm-Ausführung wird hinter dem Aufruf

fortgesetzt.

694

Page 14: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Beispiel:publi lass MyRunnable implements Runnable {publi void hello(String s) {System.out.println(s);}publi void run() {hello("I'm running ...");} // end of run()publi stati void main(String[℄ args) {Thread t = new Thread(new MyRunnable());t.start();System.out.println("Thread has been started ...");} // end of main()} // end of lass MyRunnable695

Page 15: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

• Auch das Interface Runnable verlangt die Implementierungeiner Objekt-Methode publi void run();

• publi Thread(Runnable obj); legt für ein Runnable-Objektobj ein Thread-Objekt an.

• Ist t das Thread-Objekt für das Runnable obj, dann bewirkt derAufruf t.start(); das folgende:

1. ein neuer Thread wird initialisiert;

2. die (parallele) Ausführung der Objekt-Methode run() fürobj wird angestoßen;

3. die eigene Programm-Ausführung wird hinter dem Aufruf

fortgesetzt.

696

Page 16: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Mögliche Ausführungen:Thread has been started ...I'm running ...... oder:I'm running ...Thread has been started ...

697

Page 17: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

• Ein Thread kann nur eine Operation ausführen, wenn ihm ein

Prozessor (CPU) zur Ausführung zugeteilt worden ist.

• Im Allgemeinen gibt es mehr Threads als CPUs.

• Der Scheduler verwaltet die verfügbaren CPUs und teilt sie den

Threads zu.

• Bei verschiedenen Programm-Läufen kann diese Zuteilung

verschieden aussehen!!!

• Es gibt verschiedene Politiken, nach denen sich Scheduler

richten können ↑Betriebssysteme.

1. Zeitscheiben-Verfahren:

• Ein Thread erhält eine CPU nur für eine bestimmte Zeitspanne

(Time Slice), in der er rechnen darf.

• Danach wird er unterbrochen. Dann darf ein anderer.

698

Page 18: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

699

Page 19: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

700

Page 20: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

701

Page 21: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

702

Page 22: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

703

Page 23: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

704

Page 24: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

705

Page 25: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

706

Page 26: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

707

Page 27: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

708

Page 28: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

709

Page 29: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

710

Page 30: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

711

Page 31: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Achtung:

Eine andere Programm-Ausführung mag dagegen liefern:

Scheduler

Thread-1:

Thread-2:

Thread-3:

712

Page 32: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Achtung:

Eine andere Programm-Ausführung mag dagegen liefern:

Scheduler

Thread-1:

Thread-2:

Thread-3:

713

Page 33: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

• Ein Zeitscheiben-Scheduler versucht, jeden Thread fair zu

behandeln, d.h. ab und zu Rechenzeit zuzuordnen – egal,

welche Threads sonst noch Rechenzeit beanspruchen.

• Kein Thread hat jedoch Anspruch auf einen bestimmten

Time-Slice.

• Für den Programmierer sieht es so aus, als ob sämtliche

Threads “echt” parallel ausgeführt werden, d.h. jeder über eine

eigene CPU verfügt :-)

2. Naives Verfahren:

• Erhält ein Thread eine CPU, darf er laufen, so lange er will ...

• Gibt er die CPU wieder frei, darf ein anderer Thread arbeiten ...

714

Page 34: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

715

Page 35: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

716

Page 36: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

717

Page 37: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Scheduler

Thread-1:

Thread-2:

Thread-3:

718

Page 38: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Beispiel:publi lass Start extends Thread {publi void run() {System.out.println("I'm running ...");while(true) ;}publi stati void main(String[℄ args) {(new Start()).start();(new Start()).start();(new Start()).start();System.out.println("main is running ...");while(true) ;}} // end of lass Start719

Page 39: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

... liefert als Ausgabe (bei naivem Scheduling und einer CPU) :main is running ...• Weil main nie fertig wird, erhalten die anderen Threads keineChance, sie verhungern.

• Faires Scheduling mit einem Zeitscheiben-Verfahren würde z.B.

liefern:

I'm running ...main is running ...I'm running ...I'm running ...720

Page 40: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

... liefert als Ausgabe (bei naivem Scheduling und einer CPU) :main is running ...• Weil main nie fertig wird, erhalten die anderen Threads keineChance, sie verhungern.

• Faires Scheduling mit einem Zeitscheiben-Verfahren würde z.B.

liefern:

I'm running ...main is running ...I'm running ...I'm running ...721

Page 41: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

• Java legt nicht fest, wie intelligent der Scheduler ist.

• Die aktuelle Implementierung unterstützt faires Scheduling :-)

• Programme sollten aber für jeden Scheduler das gleiche

Verhalten zeigen. Das heißt:

• ... Threads, die aktuell nichts sinnvolles zu tun haben, z.B. weil

sie auf Verstreichen der Zeit oder besseres Wetter warten,

sollten stets ihre CPU anderen Threads zur Verfügung stellen.

• ... Selbst wenn Threads etwas Vernünftiges tun, sollten sie ab

und zu andere Threads laufen lassen.

(Achtung: Wechsel des Threads ist teuer!!!)

• Dazu verfügt jeder Thread über einen Zustand, der bei der

Vergabe von Rechenzeit beücksichtigt wird.

722

Page 42: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Einige Thread-Zustände:

ready

running

dead

start

yield

sleeping

sleep

// ... time over

// ... completed

723

Page 43: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

• publi void start(); legt einen neuen Thread an, setzt den

Zustand auf ready und übergibt damit den Thread dem

Scheduler zur Ausführung.

• Der Scheduler ordnet den Threads, die im Zustand ready sind,

Prozessoren zu (“dispatching”). Aktuell laufende Threads

haben den Zustand running.

• publi stati void yield(); setzt den aktuellen Zustand

zurück auf ready und unterbricht damit die aktuelle

Programm-Ausführung. Andere ausführbare Threads erhalten

die Gelegenheit zur Ausführung.

• publi stati void sleep(int mse ) throwsInterruptedEx eption; legt den aktuellen Thread für mse Millisekunden schlafen, indem der Thread in den Zustand

sleeping wechselt.

724

Page 44: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

ready

Prozessoren

start()

725

Page 45: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

ready

Prozessoren

726

Page 46: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

ready

Prozessoren

dispatch

727

Page 47: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

ready

Prozessoren

728

Page 48: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

ready

Prozessoren

yield()

729

Page 49: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

ready

Prozessoren

730

Page 50: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

ready

Prozessoren

complete

731

Page 51: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

ready

Prozessoren

732

Page 52: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

21.1 Monitore

• Damit Threads sinnvoll miteinander kooperieren können,

müssen sie miteinander Daten austauschen.

• Zugriff mehrerer Threads auf eine gemeinsame Variable ist

problematisch, weil nicht feststeht, in welcher Reihenfolge die

Threads auf die Variable zugreifen.

• Ein Hilfsmittel, um geordnete Zugriffe zu garantieren, sind

Monitore.

... ein Beispiel:

733

Page 53: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

publi lass In implements Runnable {private stati int x = 0;private stati void pause(int t) {try {Thread.sleep((int) (Math.random()*t*1000));} at h (InterruptedEx eption e) {System.err.println(e.toString());}}publi void run() {String s = Thread. urrentThread().getName();pause(3); int y = x;System.out.println(s+ " read "+y);pause(4); x = y+1;System.out.println(s+ " wrote "+(y+1));}734

Page 54: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

...publi stati void main(String[℄ args) {(new Thread(new In ())).start();pause(2);(new Thread(new In ())).start();pause(2);(new Thread(new In ())).start();}} // end of lass In • publi stati Thread urrentThread(); liefert (eine

Referenz auf) das ausführende Thread-Objekt.

• publi final String getName(); liefert den Namen des

Thread-Objekts.

• Das Programm legt für drei Objekte der Klasse In Threads an.• Die Methode run() inkrementiert die Klassen-Variable x.

735

Page 55: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

Die Ausführung liefert z.B.:

> java In Thread-0 read 0Thread-0 wrote 1Thread-1 read 1Thread-2 read 1Thread-1 wrote 2Thread-2 wrote 2Der Grund:

736

Page 56: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

xTh-0

Th-1

Th-2 y

y

y 0

737

Page 57: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

xTh-0

Th-1

Th-2 y

y

y 0y = x;

738

Page 58: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

xTh-0

Th-1

Th-2 y

y

y 00x = y+1;

739

Page 59: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

xTh-0

Th-1

Th-2 y

y

y 0 1

y = x;

740

Page 60: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

xTh-0

Th-1

Th-2 y

y

y 0 1

1

y = x;

741

Page 61: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

xTh-0

Th-1

Th-2 y

y

y 0 1

1

1

x = y+1;

742

Page 62: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

xTh-0

Th-1

Th-2 y

y

y 0

1

1

2

x = y+1;

743

Page 63: package a; /home/seidl/java/a/b /home/seidl/java/a/d ...seidl/Courses/WS2007/i19.pdf · Objekt-Methode public void run(); implementieren. • Ist t ein Thread-Objekt, dann bewirkt

xTh-0

Th-1

Th-2 y

y

y 0

1

1

2

744