ETH Zürich, SS2001 Java Threads und RMI Thread-Synchronisation Threads in Java Grundlagen Java Threads 200m Seite 1 nur ein Kontrollfluß (Thread) • Abarbeitung in einem Thread sequentiell • Java Threads und RMI mehrere Threads • ETH Zürich, SS2001 Programmteile parallel abarbeiten • wünschenswert: sequentielle Programme • traditionell: Grundlagen Seite 2 Java Threads und RMI • besitzen verschiedene Zustände • besitzen Prioritäten müssen sich eine CPU Teilen • müssen sich synchronisieren laufen im selben Adreßraum ab (leichtgewichtige Prozesse) ETH Zürich, SS2001 • • Threads: Grundlagen 11? y=x Thread3 5 int x unwichtig wichtig sehr wichtig 6? y=x y+=1 x=y Thread1 10? C P U y=x y+=5 x=y Thread2 Seite 3 ETH Zürich, SS2001 start() newborn Thread: 1. erzeugen 2. starten 3. beenden / stoppen dead stop() running stop() stop() yield() suspend() sleep() wait() Java Threads und RMI runnable resume() notify() blocked Grundlagen Seite 4 ETH Zürich, SS2001 void join() void setName() void setPriority(int prio) boolean isAlive() • • • • Java Threads und RMI static void sleep(long millis) • von Object ererbt: • void wait() void start() • void notify() String getName() int getPriority() static void yield() Identifikation generischer Name Thread-<nummer> public Thread(Runnable target) public Thread(Runnable target, String name) Methoden: • void run() • • Konstruktoren: • public Thread() • public Thread(String name) Klasse java.lang.Thread Seite 5 ETH Zürich, SS2001 Java Threads und RMI synchronized( Object ) { ............} • verwenden Methoden synchronized deklarieren • Monitor anlegen: Monitor: • verwaltet Zugriffe auf ein Objekt • immer nur ein Zugriff möglich • zwei Zustände: frei --- vergeben critical regions Seite 6 synchronized(x){ y=x; y += 1; x=y; } Keine andere synchronized Methode ausführbar vermeiden gleichzeitigen Objektzugriffs (aus mehreren Threads) • Lösung: Objekt-Monitore gegenseitiger Ausschluß • Zweck: Threads Synchronisieren ETH Zürich, SS2001 Java Threads und RMI nächster Monitorbesitzer ist zufällig public synchronized void einzahlung(double x){ kontostand += x; } public synchronized double stand(){ return kontostand; } public Konto (double x){ kontostand = x; } class Konto{ privat double kontostand; Beispiel Seite 7 k.stand() warten k.einzahlung(6) k.einzahlung(5) bei Zugriff auf gemeinsame Daten: Synchronisation Synchronisation durch Objektmonitore synchronized Objektmethoden synchronized-Anweisungsblöcke Synchronisationsfehler sehr schwer zu finden • • • • • Java Threads und RMI Ablauf ist nichtdeterministisch • ETH Zürich, SS2001 Threads ermöglichen paralleles Arbeiten • Zusammenfassung Seite 8