Threads

Werbung
Themen
Threads in Java
Stefan Szalowski
Programmierung II
Multitasking/Threads
Einleitung
●
Begriff „Multitasking“:
●
●
Paralleles (quasi gleichzeitiges) Ausführen mehrerer
Prozesse
Aufteilung der CPU-Zeit für mehrere Prozesse
–
●
●
Vewendung eines Schedulers
Jeder Prozeß erhält eigenen Speicherbereich
Begriff „Thread“:
●
●
Aufteilung eines Prozesses in mehrere gleichzeitig
ablaufende Programmteile, die Threads
Unterschiedliche Threads laufen asynchron
–
–
Stefan Szalowski
Keine Voraussage, wann ein Thread unterbrochen wird
Möglichkeit der Synchronistaion in Java gegeben --> später
Programmierung II
Multitasking/Threads
Einleitung
●
Nutzung von Threads in Java
●
Gleichzeitiges Ausführen verschiedener Programmteile
–
–
–
●
Vorstellung, dies alles würde sequentiell ablaufen
–
–
–
Stefan Szalowski
Arbeiten mit dem Programm durch den Anwender
Speichern von Daten (im Hintergrund)
Berechnung von Programm-Parametern (im Hintergrund)
Der Anwender veranlasst das Programm zur Datenspeicherung
Problematisch bei großen Datenmengen
● Arbeit mit dem Programm blockiert, bis vollständig
gespeichert wurde
Noch Problamtischer:
● GUI-Programmierung
● Beispiel Mediaplayer
Programmierung II
Multitasking/Threads
Threads in Java
●
Eigene Thread-Klassen
–
–
Ableitung nach Klasse
Implementierung des Interface
:
:
java.lang.Thread
java.lang.Runnable
// Eigenene Threads
// ... entweder ...
public class Producer extends Thread {
// Producer erbt von Thread
}
// ... oder ...
public class Consumer implements Runnable { // Consumer implementiert
// Interface Runnable
}
Stefan Szalowski
Programmierung II
Multitasking/Threads
Threads in Java
●
Eigene Thread-Klassen
–
–
Stefan Szalowski
java.lang.Thread implementiert java.lang.Runnable
● Siehe „Javadocs“
Was bedeutet das für uns?
Programmierung II
Multitasking/Threads
Threads in Java
●
Eigene Thread-Klassen
–
–
java.lang.Thread implementiert java.lang.Runnable
● Siehe „Javadocs“
Was bedeutet das für uns?
● Eigene Thread-Klassen müssen die run()-Methode des
Interface java.lang.Runnable implementieren
public class Producer extends Thread {
}
public void run() {
// Daten erzeugen
}
public class Consumer implements Runnable {
}
public void run() {
// Daten verarbeiten
}
Stefan Szalowski
Programmierung II
Multitasking/Threads
Threads in Java
●
Eigene Thread-Klassen
–
Weshalb existieren zwei Möglichkeiten, Thread-Funktionalitäten
zu nutzen?
●
Eigene Klasse implementiert java.lang.Runnable
–
–
●
Eigene Klasse erbt von java.lang.Thread:
–
–
Stefan Szalowski
Wenn sich eigene Thread-Funktionalitäten auf die run()Methode beschränken
● Schnell mal die nächstgrößere Primzahl berechnen :o)
● Speichern im Hintergrund
In den meisten Fällen sollte Runnable implementiert werden
Wenn eigene Thread-spezifische Funktionalitäten
überschrieben werden sollen
● Eigene Aufgaben beim Starten des Threads
● Eigene Reaktionen auf Thread-Unterbrechungen
Besser Runnable implementieren!!!
Programmierung II
Multitasking/Threads
Threads in Java
●
Starten eines Threads
●
start()-Methode
–
–
Veranlasst die JVM die run()-Methode aufzurufen
Darf auf einem Thread-Objekt nur einmal aufgerufen werden
● Sonst wird IllegalThreadStateException geworfen
public class MeinProgramm {
private static Thread producer = null;
public static void main(String[] args) {
producer = new Producer();
producer.start();
// starten des Threads
nochmalStarten();
// Exception tritt auf
}
}
public static void nochmalStarten() {
producer.start();
}
Stefan Szalowski
Programmierung II
// löst Exception aus
Multitasking/Threads
Threads in Java
●
Anhalten eines Threads
●
stop()-Methode? - Nein!!!
–
●
Alternative Lösung aus Java-Festlegung:
–
●
„deprecated“ deklariert, da Gefahr eines „deadlock“ --> siehe
„Javadoc“
Ein Thread wird beendet, wenn die Ausführung seiner run()Methode endet
Unterbrechen/Aufwecken eines Threads
●
●
interrupt()-Methode
sleep()-Methoden
–
●
wait()-Methoden
–
–
●
Stefan Szalowski
Anhalten eines Threads für festgelegte Zeit
Anhalten eines Threads auch auf unbestimmte Zeit ...
... bis zum „Aufwecken“
notify()/notifyAll()-Methoden zum „erwecken“
Programmierung II
Multitasking/Threads
Threads in Java
●
Beispiel-Anwendung (aus dem Java-Tutorial):
●
Problemstellung:
–
–
–
Ein „Producer“-Thread erzeugt fortlaufend Daten ...
... und schreibt diese Daten in ein Depot mit begrenzter
Kapazität
Ein „Consumer“-Thread liest fortlaufend Daten aus dem Depot
ProducerThread
Stefan Szalowski
Zugriff
schreibend
Depot
Programmierung II
Zugriff
lesend
ConsumerThread
Multitasking/Threads
Threads in Java
●
Beispiel-Anwendung (aus dem Java-Tutorial):
●
Haupt-Programm
public class ThreadDemoProgramm {
public static void main(String[] args) {
Depot depot = new Depot();
Producer prod = new Producer(depot);
Consumer cons = new Consumer(depot);
}
}
// Erzeugen eines Threads, der die run-Methode() der Klasse
// Consumer ausführen soll
Thread consThread = new Thread(cons);
try {
consThread.start(); // Starten des Consumer-Threads
prod.start();
// Starten des Producer-Threads
} catch (Exception exc) {
exc.printStackTrace();
}
Stefan Szalowski
Programmierung II
Multitasking/Threads
Threads in Java
●
Beispiel-Anwendung (aus dem Java-Tutorial):
●
Producer-Thread
public class Producer extends Thread {
private Depot myDepot = null;
}
public Producer(Depot d) {
// Parameter gibt Depot an
this.myDepot = d;
// in das geschrieben werden soll
}
public void run() {
int i=0;
while (true) {
i++;
try {
myDepot.setContent(i);
// schreiben der Daten
} catch (InterruptedException iexc) {
iexc.printStackTrace();
}
}
}
Stefan Szalowski
Programmierung II
Multitasking/Threads
Threads in Java
●
Beispiel-Anwendung (aus dem Java-Tutorial):
●
Consumer-Thread
public class Consumer implements Runnable {
private Depot myDepot = null;
}
public Consumer(Depot d) {
// Parameter gibtDepot an, aus
this.myDepot = d;
// dem gelesen werden soll
}
public void run() {
int data = -1;
while(true) {
try {
data = myDepot.getContent();
// lesen der Daten
} catch (InterruptedException iexc) {
iexc.printStackTrace();
}
System.out.println(data);
// Ausgabe
}
}
Stefan Szalowski
Programmierung II
Multitasking/Threads
Threads in Java
●
Beispiel-Anwendung (aus dem Java-Tutorial):
●
Schwierigkeiten:
–
–
–
–
●
Threads laufen gleichzeitig
–
–
●
Stefan Szalowski
Der Producer darf nur in das Depot schreiben, wenn dieses
nicht voll ist
Der Producer darf keine noch nicht gelesenen Daten
überschreiben
Der Consumer darf nur aus dem Depot lesen, wenn dieses nicht
leer ist
Der Consumer darf keine Daten mehrfach lesen
Keine Vorhersage möglich, wann welcher Thread arbeitet
Threads können jederzeit unterbrochen werden
● Auch in der Abarbeitung einer Methode
Synchronisation erforderlich!!!
Programmierung II
Multitasking/Threads
Synchronisation/Sychronisierung
●
Mittels synchronized können Threads synchronisiert werden
●
d.h. die (quasi) gleichzeitige Ausführung einer Methode durch
verschiedene Threads wird unterbunden
public class Depot {
public synchronized int getContent()
throws InterruptedException {
// etwas sinnvolles
}
public synchronized void setContent(int content)
throws InterruptedException {
// etwas sinnvolles
}
Stefan Szalowski
Programmierung II
Multitasking/Threads
Synchronisation/Sychronisierung
●
Beipiel-Programm
Stefan Szalowski
Programmierung II
Multitasking/Threads
Herunterladen