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