C Threads. C.2 Vorteile / Nachteile. C.3 Thread Erzeugung: Möglichkeit 1. C.1 Was ist ein Thread? Vorteile: Referenz: Nachteile:

Ähnliche Dokumente
D.1 Threads. 1 Was ist ein Thread? 2 Vorteile / Nachteile. Aktivitätsträger mit: Threads - Überblick. Synchronisation. Probleme

C.1 Threads. 1 Was ist ein Thread? 2 Vorteile / Nachteile. Aktivitätsträger mit: Threads - Überblick. Synchronisation. Probleme

Überblick. Verteilte Systeme - Übung. Was ist ein Thread? Threads in Java. Multithreading in Java Threads Synchronisation Koordinierung

Überblick. Generische Datenstrukturen. Traversieren von Datenstrukturen. Package: java.util

Middleware - Cloud Computing Übung

Überblick. Generische Datenstrukturen. Traversieren von Datenstrukturen. Package: java.util

Überblick. Java Collections & Maps Threads Synchronisation Koordinierung. MW-Übung (WS11/12) Java Collections & Maps 2 1

Java Concurrency Utilities

Muster nebenläufiger Programmierung. concurrent Packet von Java. Alois Schü;e AOSD 1

Überblick. Java Collections & Maps Threads Kritische Abschnitte Koordinierung. MW-Übung (WS15/16) Java 2 1

Einführung Verteilte Systeme - Java Threads III -

Vorlesung Informatik II

Lebenszyklus von Threads

Praktikum aus Softwareentwicklung 2, Stunde 5

Laborskript Verteilte Systeme

Javakurs für Fortgeschrittene

Ausnahmebehandlung in Java

Java Threads. von Gerhart Mende und Awad Fuad. Fuad Awad & Gerhart Mende ProSeminar parallele Programmierung 1

Programmieren II. Nebenläufigkeit. Vorlesung 9. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester Threads. Kritische Bereiche

Threads Kritische Bereiche Reales Beispiel Deadlocks Wait/Notify. Programmieren II. Martin Schultheiß. Hochschule Darmstadt Sommersemester 2011

Nebenläufigkeit mit Java

Institut fu r Informatik

Objektorientierte Programmierung

Deadlocks Wait/Notify Reflections JavaBeans. Programmieren II. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester / 33

Parallele Prozesse. Prozeß wartet

Überblick. Middleware - Übung. Threads in Java. Was ist ein Thread? Multithreading in Java Threads Synchronisation Koordinierung

Nebenläufige Programmierung in Java: Threads

Programmierung mit Threads in Java

Programmieren II. Verklemmungen. Vorlesung 10. Handout S. 1. Dr. Klaus Höppner. Hochschule Darmstadt Sommersemester Deadlocks.

Ausgewählte Implementierungsprobleme

Testen nebenläufiger Objekte

Philipp Güttler Progwerkstatt Letzte Änderung: Enums, Interfaces, Generics und Threads

parallele Prozesse auf sequenziellen Prozessoren Ein Process ist ein typisches Programm, mit eigenem Addressraum im Speicher.

Einführung in die Programmierung Blockkurs Java

Threads - und wie sie in Java implementiert sind. Vortrag von Lukas Klimmasch, Stefan Lang und Ralf Schmidt Jena, den

Nebenläufigkeit mit Java

Kapitel 6. Verklemmungen (Deadlocks)

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen

Java I Vorlesung Nebenläufigkeit

PROG 2: Einführung in die Programmierung für Wirtschaftsinformatiker

Beispiel für überladene Methode

Einführung Verteilte Systeme - Java Threads I -

Parallele Prozesse Prozeß Parallele Prozesse verzahnte Prozesse Nebenläufige Prozesse: Threads Vorlesung Software-Entwicklung / Folie 131 Ziele:

Informatik B. Vorlesung 8 Synchronisierung von Threads. Dr. Ralf Kunze

Info B VL 17: Deadlocks

Nebenläufigkeit mit Java

Prozesszustände (1a)

Dr. Monika Meiler. Inhalt

Liste Programmieren Java Überblick

OOP: Nebenläufigkeiten Threads. Dipl.-Inform. Arnold Willemer

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore.

Verteilte Systeme. 2. Die Client-Server-Beziehung und daraus resultierende Techniken. 2.2 Nebenläufigkeitstechniken in Java

Parallele und funktionale Programmierung Wintersemester 2013/ Übung Abgabe bis , 16:00 Uhr

Vorlesung 7. Multithreading in Java 5: Die neuen Concurrency APIs

Zur Erinnerung: Threads. Threadverwaltung. Threads: Prioritäten. Beispiel Flugbuchungsprogramm. Nichtdeterminismus

Threading. Arthur Zaczek. Aug 2015

Wirtschaftsinformatik II Sommersemester Lo sungshinweise zu den Ü bungen P. Mandl, M. Dolag, B. Rottmüller, et al.

Leser-Schreiber-Realisierung mit Semaphoren

Sven Osterwald Concurrent Objects. Proseminar Parallele Programmierung in Java

(b.) Welche Möglichkeit gibt es, die Methode run so zu verändern, dass Bora Bora IMMER zuletzt ausgegeben wird?

Grundlagen in C# und.net

Aufgabenblatt 6 Musterlösung

Wintersemester 2009/10 Helmut Seidl Institut für Informatik TU München

Multithreading ab Java 5: Die neuen Concurrency APIs

Versuchsziele. Grundlagen. Überblick: FB Automatisierung und Informatik Betriebssysteme Thema: Bounded-Buffer-Problem. 3.

Übung zu Grundlagen der Betriebssysteme. 10. Übung

Überblick. Verteilte Systeme - Übung. VS-Übung. Asynchrone Fernaufrufe Asynchrone Fernaufrufe Evaluation von Systemen. Tobias Distler, Michael Gernoth

Vorlesung Informatik II

6 Speicherorganisation

Synchronisation in Java. Invisible Web

Prozesse. Prozesse sind Programme. Prozesse können aus Unterprozessen bestehen. Prozesshierarchie Unterprozesse Threads

Java Schulung (Java 2 Java Development Kit 5 / 6)

Übungen zu Middleware Universität Erlangen-Nürnberg Informatik 4, 2007 Z-Java-Exceptions.fm

Algorithmen und Datenstrukturen

Thread-Konzept in objektorientierten Programmiersprachen. Threads. Threads in Java

Einführung in die Programmierung Blockkurs Java

JJ Prozesse und Nebenläufigkeit

Java Threads. Mutex, Race Condition, Deadlock, Starvation und Co.. Prof. Dr. Nikolaus Wulff

Nebenläufige Anwendungen in Java (J2SE, Rich Client, J2EE)

Lehrstuhl für Datenverarbeitung. Technische Universität München. Leistungskurs C++ Multithreading

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Multi-Threading. Ralf Abramowitsch Vector Informatik GmbH

Institut für Informatik. Endterm Klausur zu Informatik I 20. Februar 2010

Heap vs. Stack vs. statisch. 6 Speicherorganisation. Beispiel Statische Variablen. Statische Variablen

Institut für Programmierung und Reaktive Systeme. Java 7. Markus Reschke

Dezentrale Kontrolle: Aktive Objekte. Aktive Objekte Die Klasse AnimatorThread Aktivierung Objekte beobachten Die Java-Klasse Thread

Nebenläufigkeit in Java. Prof. Dr. Margarita Esponda

Parallele Programmierung in Java

5. Threads, Serverprozesse und Benachrichtigungen

EINFÜHRUNG IN DIE PROGRAMMIERUNG

Threads In dieser Übung beschäftigen wir uns mit der Realisierung von Threads in Java.

Algorithmen und Datenstrukturen II

Institut fu r Informatik

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Transkript:

C.2 Vorteile / Nachteile C Threads Referenz: D. Lea. Concurrent Programming in Java - Design Principles and Patterns. The Java Series. Addison-Wesley 1999. Scott Oaks; Henry Wong - Java Threads, 3rd Edition - 2004 http://proquestcombo.safaribooksonline.com/0596007825 John Ousterhout: Why Threads Are A Bad Idea (for most purposes). C.2 Vorteile / Nachteile Vorteile: Ausführen paralleler Algorithmen auf einem Multiprozessorrechner durch das Warten auf langsame Geräte (z.b. Netzwerk, Benutzer) wird nicht das gesamte Programm blockiert Nachteile: komplexe Semantik Fehlersuche schwierig Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 1 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 3 C.1 Was ist ein Thread? C.1 Was ist ein Thread? C.3 Thread Erzeugung: Möglichkeit 1 C.3 Thread Erzeugung: Möglichkeit 1 Aktivitätsträger mit eigenem Ausführungskontext: Instruktionszähler, Register und Stack Alle Threads laufen im gleichen Adressbereich Thread A lokale Variablen Thread B lokale Variablen Objekte 0 (1) Eine Unterklasse von java.lang.thread erstellen. Threads können zur besseren Fehlersuche benannt werden. (2) Dabei die run()-methode überschreiben. (3) Eine Instanz der Klasse erzeugen. (4) An dieser Instanz die Methode aufrufen. Beispiel: class Test extends Thread { public Test(String name) { super(name); public void run() { System.out.println("Test"); Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 2 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 4

C.4 Thread Erzeugung: Möglichkeit 2 C.6 Die Methode join C.4 Thread Erzeugung: Möglichkeit 2 C.6 Die Methode join 0 (1) Das Interface java.lang.runnable implementieren. Dabei muss eine run()-methode erstellt werden. (2) Ein Objekt instantiieren, welches das Interface Runnable implementiert. (3) Eine e Instanz von Thread erzeugen, dem Konstruktor dabei das Runnable-Objekt mitgeben. (4) Am en Thread-Objekt die -Methode aufrufen. Ein Thread kann auf die Beendigung eines anderen Threads warten: workerthread = new Thread(worker); workerthread.join(); worker.result(); Beispiel: class Test implements Runnable { public void run() { System.out.println("Test"); Test test = new Test(); Thread thread = new Thread(test); thread.; Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 5 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 7 C.5 Die Methode sleep C.5 Die Methode sleep Ein Thread hat die Methode sleep(long n) um für n Millisekunden zu schlafen. Der Thread kann jedoch verdrängt worden sein nachdem er aus dem sleep() zurückkehrt. C.7 Daemon-Threads vs. User Threads C.7 Daemon-Threads vs. User Threads Daemon-Threads werden für Hintergrundaktivitäten genutzt Sie sollen nicht für die Hauptaufgabe eines Programmes verwendet werden Sobald alle nicht-daemon Threads beendet sind, ist auch das Programm beendet. Woran erkennt man, ob ein Thread ein Daemon-Thread sein soll? Wenn man keine Bedingung für die Beendigung des Threads angeben kann. Wichtige Methoden der Klasse Thread: setdaemon(boolean switch): Ein- oder Ausschalten der Daemon- Eigenschaft (nur vor dem Aufruf von ). boolean isdaemon(): Prüft ob ein Thread ein Daemon ist. Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 6 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 8

(3) Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 9 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 11 (2) (4) run() beendet tot Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 10 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 12

(5) warten auf IO blockiert IO bereit (7) warten auf IO warten auf e. Sperre blockiert sleep(msec) IO bereit Sperre verfügbar Zeit abgelaufen run() beendet run() beendet tot tot Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 13 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 15 (6) warten auf IO warten auf e. Sperre blockiert IO bereit Sperre verfügbar (8) warten auf IO blockiert warten auf e. Sperre sleep(msec) IO bereit Sperre verfügbar Zeit abgelaufen interrupt() run() beendet run() beendet isinterrupted() InterruptedException tot tot Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 14 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 16

C.9 Veraltete Methoden der Klasse Thread C.9 Veraltete Methoden der Klasse Thread stop(), suspend(), resume() sind seit Java 1.2 veraltet stop() gibt alle Sperren des Thread frei - kann zu Inkonsistenzen führen suspend() und resume() können zu einem Deadlock führen: suspend gibt keine Sperren frei angehaltener Thread kann Sperren halten Thread, der resume() aufrufen will blockiert an einer Sperre destroy() gibt keine Sperren frei interrupt() wird verwendet um einen Thread kontrolliert zu beenden Es kann isinterrupted() oder eine Variable genutzt werden Ist der Thread blockiert wird eine Exception ausgelöst C.10Multithreading Probleme (2) C.10 Multithreading Probleme Ergebnis einiger Durchläufe: 173274, 137807, 150683 Was passiert, wenn a = a + 1 ausgeführt wird? LOAD a into Register ADD 1 to Register STORE Register into a mögliche Verzahnung wenn zwei Threads beteiligt sind (initial a=0): T1-load:a=0,Reg1=0 T2-load:a=0,Reg2=0 T1-add:a=0,Reg1=1 T1-store:a=1,Reg1=1 T2-add:a=1,Reg2=1 T2-store:a=1,Reg2=1 Die drei Operationen müssen atomar ausgeführt werden! Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 17 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 19 C.10 Multithreading Probleme C.10 Multithreading Probleme public class Adder implements Runnable { public int a=0; public void run() { for(int i=0; i<100000; i++) { a = a + 1; Was ist das Ergebnis dieses Programmes? public static void main(string[] args) { Runnable value = new Adder(); Thread t1 = new Thread(value); zwei Threads erzeugen, Thread t2 = new Thread(value); mit demselben Runnable Objekt t1.; beide Threads starten t2.; try { t1.join(); auf Beendigung der beiden Threads warten t2.join(); catch(exception e) { System.out.println("Exception"); System.out.println("Expected a=200000 but a="+value.a); Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 18 C.11 Das Schlüsselwort synchronized C.11 Das Schlüsselwort synchronized Jedes Objekt kann als Sperre verwendet werden. Um eine Sperren anzufordern und freizugeben wird ein synchronized Konstrukt verwendet. Methoden oder Blöcke können als synchronized deklariert werden: class Test { public void n() { synchronized(this) { ein Thread kann eine Sperre mehrfach halten (rekursive Sperre) verbessertes Beispiel: synchronized(this) { a = a + 1; Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 20

C.11 Das Schlüsselwort synchronized C.11Das Schlüsselwort synchronized Vereinfachte Schreibweise Anstatt: class Test { public void n() { synchronized(this) { kann auch folgendes geschrieben werden: class Test { public synchronized void n() { C.12 Synchronisationsvariablen (Condition Variables) C.12 Synchronisationsvariablen (Condition Variables) Thread muss warten bis eine Bedingung wahr wird. zwei Möglichkeiten: aktiv (polling) passiv (condition variables) Jedes Objekt kann als Synchronisationsvariable verwendet werden. Die Klasse Object enthält Methoden um ein Objekt als Synchronisationsvariable zu verwenden. wait: auf ein Ereignis warten while(! condition) { wait(); notify: Zustand wurde verändert, die Bedingung könnte wahr sein, einen anderen Thread benachrichtigen notifyall: alle wartenden Threads aufwecken (teuer) Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 21 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 23 C.11 Das Schlüsselwort synchronized C.11Wann soll synchronized verwendet werden? synchronized ist nicht notwendig: wenn Code immer nur von einem Thread ausgeführt wird (single-threaded context) private Methoden, die nur auf Objektvariablen zugreifen für "getter" von einfachen Datentypen C.12Warten und Sperren C.12 Synchronisationsvariablen (Condition Variables) wait() kann nur ausgeführt werden, wenn der aufrufende Thread eine Sperre an dem Objekt hält (z.b. synchronized()-block) wait() gibt die Sperre frei bevor der Thread blockiert wird (atomar) beim Deblockieren wird die Sperre wieder atomar angefordert synchronized sollte verwendet werden: für "getter" auf long, etc. wenn der Zustand eines Objekts aus mehreren Komponenten zusammengesetzt ist Beim Zugriff auf globale Objekte Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 22 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 24

C.12Condition Variables - Beispiel PV-System: Bedingung: count > 0 C.12 Synchronisationsvariablen (Condition Variables) class SimpleSemaphore { private int count; public SimpleSemaphore(int count) { this.count = count; public synchronized void P() throws InterruptedException{ while (count <= 0) { this.wait(); count--; public synchronized void V() { count++; this.notify(); C.14 Vorraussetzungen für Verklemmungen C.14 Vorraussetzungen für Verklemmungen Wiederholung aus dem SOS1 Skript notwendige Bedinungen: exclusive Belegung von Betriebsmitteln (mutual exclusion) die umstrittenen Betriebsmittel sind nur unteilbar nutzbar Nachforderung von Betriebsmitteln (hold and wait) die umstrittenen Betriebsmittel sind nur schrittweise belegbar kein Entzug von Betriebsmitteln (no preemption) die umstrittenen Betriebsmittel sind nicht rückforderbar hinreichende Bedingung zirkuläres Warten (circular wait) Existenz einer geschlossenen Kette wechselseitig wartender Prozesse Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 25 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 27 C.13 Deadlock: Das Philosophenproblem C.13 Deadlock: Das Philosophenproblem C.15 Deadlocks C.15 Deadlocks Counter class Counter { private int count = 0; public synchronized void inc() { count++; public int getcount() {return count; Philosoph denken essen denken essen ein Philosoph braucht beide Gabeln zum Essen Gabel alle Philosophen nehmen zuerst die rechte Gabel dann die linke Verklemmung public void setcount(int count) { this.count = count; public synchronized void swap(counter counter) { synchronized (counter) { // Deadlock Gefahr int tmp = counter.getcount(); counter.setcount(count); count = tmp; Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 26 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 28

C.15 Deadlocks C.16 Deadlock - Vermeidung(1) C.15Ablauf Wie kommt es zum Deadlock? C.16Deadlock Vermeidung (2) Ressourcen (Locks) werden atomar angefordert: class Counter { static Object lock = new Object(); public void swap(counter counter) { synchronized (lock) { synchronized(this) { synchronized (counter) { int tmp = counter.getcount(); counter.setcount(count); count = tmp; Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 29 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 31 C.16 Deadlock - Vermeidung(1) C.16 Deadlock - Vermeidung(1) Verhinderung zyklischer Ressourcenanforderung, Ordnung auf Locks class Counter { public void swap(counter counter) { Counter first = this; Counter second = counter; if (System.identityHashCode(this) < System.identityHashCode(counter)) { first = counter; second = this; synchronized (first) { synchronized (second) { int tmp = counter.getcount(); counter.setcount(count); count = tmp; C.17 Nachteile von synchronized()-locks C.17 Nachteile von synchronized()-locks Methoden lock() und unlock() von synchronized()-locks sind nur im Java Bytecode sichtbar kein Timeout beim Warten auf ein Lock möglich (Deadlock-Erkennung) Es kann keine alternative Semantik (z.b. zur Implementierung von fairness) definiert werden. Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 30 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 32

C.18 Explizite Locks mit java.util.concurrent.locks C.19 ReentrantLock Beispiel C.18 Explizite Locks mit java.util.concurrent.locks Allgemeines Interface: Lock Sperre anfordern void lock() void lockinterruptibly() throws InterruptedException boolean trylock() boolean trylock(long time, TimeUnit unit) throws InterruptedException Sperre freigeben: void unlock() "Condition"-Variable für diese Sperre erzeugen Condition newcondition() C.19 ReentrantLock Beispiel class Counter { static ReentrantLock lock = new ReentrantLock(); public void swap(counter counter) { lock.lock(); try{ synchronized(this) { synchronized (counter) { int tmp = counter.getcount(); counter.setcount(count); count = tmp; finally { lock.unlock(); Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 33 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 35 C.18Lock - Implementierungen C.18 Explizite Locks mit java.util.concurrent.locks ReentrantLock - eine Implementierungen von Lock Sehr ähnliche Semantik wie synchronized()-locks Wesentlich bessere Performanz bei heftiger Benutzung enthält weitere sinnvolle Methoden: Wer hält die Sperre? Thread getowner() Wer wartet auf die Sperre? Collection<Thread> getqueuedthreads() Wer wartet auf eine Bedingung? Collection<Thread> getwaitingthreads(condition c) C.20 Condition Auf Signal warten C.20 Condition void await() throws InterruptedException analog zu Object.wait() void awaituninterruptibly() boolean await(long time, TimeUnit unit) throws InterruptedException boolean awaituntil(date deadline) throws InterruptedException Signalisieren void signal() analog zu Object.notify() void signalall() analog zu Object.notifyAll() Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 34 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 36

C.21 SimpleSemaphore revisited public class SimpleSemaphore { private int count; private ReentrantLock lock; private Condition c; C.21 SimpleSemaphore revisited public SimpleSemaphore (int count) { this.lock = new ReentrantLock(); this.c = lock.newcondition(); this.count = count; C.22 synchronized vs. ReentrantLock() C.22 synchronized vs. ReentrantLock() ReentrantLock Mehr Features (timed wait, interruptable waits, ) Performanter nicht an Codeblöcke gebunden schwierig zu Debuggen synchronized() Viel Code benutzt ihn JVM kann beim Debuggen helfen einfacher zu benutzen man kann kein lock.unlock() vergessen Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 37 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 39 C.21SimpleSemaphore revisited(2) C.21 SimpleSemaphore revisited public class SimpleSemaphore { public void P() throws InterruptedException { this.lock.lock(); while (count <= 0) { this.c.await(); this.count--; this.lock.unlock(); public void V() { this.lock.lock(); this.count++; this.c.signal(); this.lock.unlock(); C.23 Die Klasse java.util.concurrent.semaphore C.23 Die Klasse java.util.concurrent.semaphore Ein zählender Semaphor: Semaphore(int permits, [boolean fair]) Belegen / Freigeben: acquire([int permits]) throws InterruptedException acquireuninterruptibly([int permits]) tryacquire([int permits, ] [long timeout]) release([int permits]) Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 38 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 40

C.24 Thread Managment mit java.util.concurrent C.24 Thread Managment mit java.util.concurrent Einheitliche Schnittstelle: // Anstatt: new Thread(new(RunnableTask())). // Per Executor Interface: Executor executor = anexecutor; executor.execute(new RunnableTask1()); executor.execute(new RunnableTask2()); Mögliche Implementierungen: Direkte, synchrone Ausführung Im Hintergrund hintereinander Im Hintergrund paralell C.25 Die Fabrik Executors C.25Subinterface ExecutorService Ein Executor zur asynchronen Methodenausführung Runnable mit Rückgabe und Exception: Callable<V> V call() throws Exception Ausführung Benutzung durch die Klasse ExecutorService <T> Future<T> submit(callable<t> task) Future<?> submit(runnable task) Ergebnis als Platzhalter: Future<V> booleancancel(boolean mayinterruptifrunning) V get() V get(long timeout, TimeUnit unit) boolean isdone() Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 41 Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 43 C.25 Die Fabrik Executors C.25 Die Fabrik Executors Klasse Executors mit statischen Methoden: static ThreadFactory defaultthreadfactory() Kann als optionaler Parameter den folgenden Factorys angegeben werden static ExecutorService newsinglethreadexecutor() Arbeitet "Tasks" nacheinander ab. Implementiert eine "worker queue" static ExecutorService newcachedthreadpool() Erzeugt bei Bedarf e Threads Verwendet ggf. Ausführungskontext von beendeten Threads wieder static ExecutorService newfixedthreadpool(int nthreads) Erzeugt im vorraus n Threads Universität Erlangen-Nürnberg Informatik 4, 2008 SS 2008 VS (JavaThreads.fm 2008-04-30 09.50) C - 42