Threads in Java

Werbung
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
Herunterladen