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

Größe: px
Ab Seite anzeigen:

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

Transkript

1 Programmieren II Martin Schultheiß Hochschule Darmstadt Sommersemester 2011

2 1 Threads 2 Kritische Bereiche 3 Reales Beispiel 4 Deadlocks 5 Wait/Notify

3 Nebenläufigkeit Moderne Betriebssysteme unterstützen das Prinzip der Nebenläufigkeit. Dies bedeutet, dass Prozesse parallel ausgeführt werden können.

4 Nebenläufigkeit Moderne Betriebssysteme unterstützen das Prinzip der Nebenläufigkeit. Dies bedeutet, dass Prozesse parallel ausgeführt werden können. Nur auf Multiprozessor-Systemen können Prozesse echt parallel ablaufen. Ansonsten laufen diese nur quasi-parallel ab, indem das Betriebssystem den einzelnen Prozessen regelmäßig kleine Portionen CPU-Zeit zuordnet, so dass diese als gleichzeitig ablaufend erscheinen.

5 Nebenläufigkeit Moderne Betriebssysteme unterstützen das Prinzip der Nebenläufigkeit. Dies bedeutet, dass Prozesse parallel ausgeführt werden können. Nur auf Multiprozessor-Systemen können Prozesse echt parallel ablaufen. Ansonsten laufen diese nur quasi-parallel ab, indem das Betriebssystem den einzelnen Prozessen regelmäßig kleine Portionen CPU-Zeit zuordnet, so dass diese als gleichzeitig ablaufend erscheinen. Da ein einzelner Prozess selten ständig 100 % der CPU-Zeit benötigt, ist hiermit oft kein wesentlicher Geschwindigkeitsverlust feststellbar.

6 Threads Neben Multitasking (quasi-parallele Ausführung unabhängiger Prozesse mit eigenem Adressraum) unterstützen moderne Betriebssysteme auch Multithreading.

7 Threads Neben Multitasking (quasi-parallele Ausführung unabhängiger Prozesse mit eigenem Adressraum) unterstützen moderne Betriebssysteme auch Multithreading. Hier laufen innerhalb eines Programms mehrere Ausführungsstränge (Threads, dt. Fäden) nebenläufig ab.

8 Threads Neben Multitasking (quasi-parallele Ausführung unabhängiger Prozesse mit eigenem Adressraum) unterstützen moderne Betriebssysteme auch Multithreading. Hier laufen innerhalb eines Programms mehrere Ausführungsstränge (Threads, dt. Fäden) nebenläufig ab. Diese Thread besitzen zwar einen eigenen Stack, teilen sich aber die sonstigen Ressourcen des Programms. Da die Threads den gleichen Adressraum verwenden, ist somit eine direkte Kommunikation zwischen Threads möglich. Threads können sich so aber auch negativ beeinflussen. Daher müssen manchmal kritische Bereiche geschützt werden, was wieder zu Verklemmungen (deadlock) führen kann.

9 Schaubild

10 Threads in Java Java unterstützt seit jeher Threads, sogar unter Betriebssystemen, die nicht multithreaded sind (dann übernimmt die JVM die Threadverwaltung, d. h. Threadumschaltung einschließlich Stackverwaltung).

11 Threads in Java Java unterstützt seit jeher Threads, sogar unter Betriebssystemen, die nicht multithreaded sind (dann übernimmt die JVM die Threadverwaltung, d. h. Threadumschaltung einschließlich Stackverwaltung). Für Java-Threads existiert die Klasse Thread. Diese erwartet ein Objekt, das das Interface Runnable implementiert.

12 Threads in Java Java unterstützt seit jeher Threads, sogar unter Betriebssystemen, die nicht multithreaded sind (dann übernimmt die JVM die Threadverwaltung, d. h. Threadumschaltung einschließlich Stackverwaltung). Für Java-Threads existiert die Klasse Thread. Diese erwartet ein Objekt, das das Interface Runnable implementiert. Runnable definiert dabei die abstrakte Methode run(), die ein Objekt dann implementieren muss. Ein Thread wird dann mit start () gestartet, wobei dieser dann für das Objekt, das Runnable implementiert, die Methode run() nebenläufig ausführt.

13 Beispiel Runnable r1 = new Runnable ( ) { p u b l i c void run ( ) { f o r ( i n t i =0; i <100000; i++) { double summe = 0. 0 ; f o r ( i n t j =0; j <100; j++) summe += Math. s i n (Math. i f ( i %1000 == 0) System. out. p r i n t l n (new Date ( ) ) ; ; Runnable r2 = new Runnable ( ) { p u b l i c void run ( ) { f o r ( i n t i =0; i <100000; i++) { double summe = 0. 0 ; f o r ( i n t j =0; j <100; j++) summe += Math. s i n (Math. i f ( i %1000 == 0) System. out. p r i n t l n ( i ) ; ;

14 Starten der Threads Im vorigen Beispiel werden zwei Runnable-Objekte angelegt, die in einer Schleife Sinuswerte aufaddieren (dies dient hier ausschließlich zum Verbraten von Rechenzeit) und regelmäßig Meldungen auf der Konsole aufgeben.

15 Starten der Threads Im vorigen Beispiel werden zwei Runnable-Objekte angelegt, die in einer Schleife Sinuswerte aufaddieren (dies dient hier ausschließlich zum Verbraten von Rechenzeit) und regelmäßig Meldungen auf der Konsole aufgeben. Damit die Methoden run() beider Objekte parallel ablaufen, werden diese nun per Thread gestartet: new Thread ( r1 ). s t a r t ( ) ; new Thread ( r2 ). s t a r t ( ) ; Nun erscheinen die Ausgaben der beiden Treads miteinander vermischt auf der Konsole.

16 Unterbrechen von Threads Die beiden Threads im vorigen Beispiel laufen solange, bis bei beiden Runnable-Objekten run() fertig ist (und solange läuft das Programm auch in der JVM, auch wenn main schon zu Ende ist).

17 Unterbrechen von Threads Die beiden Threads im vorigen Beispiel laufen solange, bis bei beiden Runnable-Objekten run() fertig ist (und solange läuft das Programm auch in der JVM, auch wenn main schon zu Ende ist). Ein Thread kann mit interrupt () zum Beenden aufgefordert werden. In diesem Fall wird ein Interrupt-Flag gesetzt. Dass die Methode run() hierauf reagiert, muss aber selber implementiert werden.

18 Unterbrechen von Threads Die beiden Threads im vorigen Beispiel laufen solange, bis bei beiden Runnable-Objekten run() fertig ist (und solange läuft das Programm auch in der JVM, auch wenn main schon zu Ende ist). Ein Thread kann mit interrupt () zum Beenden aufgefordert werden. In diesem Fall wird ein Interrupt-Flag gesetzt. Dass die Methode run() hierauf reagiert, muss aber selber implementiert werden. Im folgenden Beispiel werden 2 Sekunden lang Zufallszahlen ausgegeben. Hierbei wird eingeführt, dass Thread auch Runnable implementiert, man also von Thread erben und dort run() überladen kann.

19 Beispiel für interrupt() Thread t = new Thread ( ) p u b l i c void run ( ) { while (! i s I n t e r r u p t e d ( ) ) System. out. p r i n t l n (Math. random ( ) ) ; ; t. s t a r t ( ) ; try { Thread. s l e e p ( ) ; catch ( InterruptedException e ) { f i n a l l y { t. i n t e r r u p t ( ) ;

20 Treads und Dämonen Die JVM führt ein Programm solange aus, solange noch Threads des Programms aktiv sind. Dies führt dazu, dass ein Programm noch weiter laufen kann, auch wenn die Methode main (...) abgearbeitet ist (d. h. der Hauptthread des Programms zu Ende ist).

21 Treads und Dämonen Die JVM führt ein Programm solange aus, solange noch Threads des Programms aktiv sind. Dies führt dazu, dass ein Programm noch weiter laufen kann, auch wenn die Methode main (...) abgearbeitet ist (d. h. der Hauptthread des Programms zu Ende ist). Solche Threads werden als User Thread bezeichnet. Wenn also der Hauptthread endet, wird die JVM nicht beendet, solange noch User Threads laufen.

22 Treads und Dämonen Die JVM führt ein Programm solange aus, solange noch Threads des Programms aktiv sind. Dies führt dazu, dass ein Programm noch weiter laufen kann, auch wenn die Methode main (...) abgearbeitet ist (d. h. der Hauptthread des Programms zu Ende ist). Solche Threads werden als User Thread bezeichnet. Wenn also der Hauptthread endet, wird die JVM nicht beendet, solange noch User Threads laufen. Demgegenüber kann ein Thread als Demon Thread gekennzeichnet werden, durch Aufruf von setdemon(true) vor dem Starten des Threads. Diese werden von der JVM nicht beachtet, sobald also nur noch Dämonen laufen, wird die Anwendung endgültig beendet.

23 Konflikte bei konkurrierenden Threads Während Threads zwar ihren eigenen Stack besitzen, greifen Sie ansonsten auf den selben Adressbereich zu. Sie teilen sich also Daten!

24 Konflikte bei konkurrierenden Threads Während Threads zwar ihren eigenen Stack besitzen, greifen Sie ansonsten auf den selben Adressbereich zu. Sie teilen sich also Daten! Dies muss bei der Programmierung berücksichtigt werden. Es kann passieren, dass in einem Thread Daten geändert werden, während ein anderer Daten verarbeitet (und dabei implizit davon ausgeht, dass die zu Daten sich während der Verarbeitung nicht ändern).

25 Konflikte bei konkurrierenden Threads Während Threads zwar ihren eigenen Stack besitzen, greifen Sie ansonsten auf den selben Adressbereich zu. Sie teilen sich also Daten! Dies muss bei der Programmierung berücksichtigt werden. Es kann passieren, dass in einem Thread Daten geändert werden, während ein anderer Daten verarbeitet (und dabei implizit davon ausgeht, dass die zu Daten sich während der Verarbeitung nicht ändern). Probleme treten immer dann auf, wenn mitten in solch einem kiritschen Bereich eine Threadumschaltung passiert. Die Aufgabe des Programmierers besteht also darin, solche kritischen Bereiche zu identifizieren und zu schützen.

26 Beispiel p u b l i c c l a s s K o n f l i k t 1 extends Thread { p r i v a t e s t a t i c double x p u b l i c void run ( ) { while (! i s I n t e r r u p t e d ( ) ) { double x_lokal = Math. random ( ) ; x = x_lokal ; double summe = 0 ; f o r ( i n t i =0; i <100; i++) summe+=math. s i n (Math. ra i f ( x!= x_lokal ) System. out. format ( "Ups : x=%10.8 f x_ lokal =%10 x, x_lokal ) ;

27 Analyse Eigentlich sieht der Code der Methode run() sehr harmlos aus. Die lokale Variable x_lokal wir auf einen zufälligen Wert gesetzt, dieser wird auch dem statischen Attribut x zugewiesen. Anschließend werden einige Sinus-Werte berechnet, um Rechenzeit zu verbrauchen.

28 Analyse Eigentlich sieht der Code der Methode run() sehr harmlos aus. Die lokale Variable x_lokal wir auf einen zufälligen Wert gesetzt, dieser wird auch dem statischen Attribut x zugewiesen. Anschließend werden einige Sinus-Werte berechnet, um Rechenzeit zu verbrauchen. Eigentlich sollte die Bedingung x!=x_lokal niemals zutreffen. Laufen jedoch mehrere Threads gleichzeitig new K o n f l i k t 1 ( ). s t a r t ( ) ; new K o n f l i k t 1 ( ). s t a r t ( ) ; so kann es passieren, dass zwischen Zuweisung und Abfrage durch den ersten Thread der zweite das gemeinsam benutzte Attribut x ändert, während x_lokal des ersten sich nicht ändert, da diese im eigenen Stackbereich des Threads liegt.

29 Schützen kritischer Bereiche Im vorigen Beispiel stellt der Code zwischen Zuweisen an das statische Attribut und Testen auf Gleichheit mit der lokalen Variable einen kritischen Bereich dar. Hier muss sicher gestellt werden, dass dieser von einem Thread immer komplett durchlaufen wird und ein anderer Thread hier nicht gleichzeitig eindringen kann.

30 Schützen kritischer Bereiche Im vorigen Beispiel stellt der Code zwischen Zuweisen an das statische Attribut und Testen auf Gleichheit mit der lokalen Variable einen kritischen Bereich dar. Hier muss sicher gestellt werden, dass dieser von einem Thread immer komplett durchlaufen wird und ein anderer Thread hier nicht gleichzeitig eindringen kann. Kritische Bereiche können in Java mit einem Monitor geschützt werden. Solch ein Monitor besitzt einen Lock-Mechanismus, der verriegelt wird, wenn ein Thread den kritischen Bereich betritt, und wieder entriegelt, wenn er den Bereich verlässt.

31 Schützen kritischer Bereiche Im vorigen Beispiel stellt der Code zwischen Zuweisen an das statische Attribut und Testen auf Gleichheit mit der lokalen Variable einen kritischen Bereich dar. Hier muss sicher gestellt werden, dass dieser von einem Thread immer komplett durchlaufen wird und ein anderer Thread hier nicht gleichzeitig eindringen kann. Kritische Bereiche können in Java mit einem Monitor geschützt werden. Solch ein Monitor besitzt einen Lock-Mechanismus, der verriegelt wird, wenn ein Thread den kritischen Bereich betritt, und wieder entriegelt, wenn er den Bereich verlässt. Java kennt dabei zwei wesentliche Methoden zum Schutz kritischer Bereiche: Direkt über ein Lock-Objekt, über ein synchronized für einen Bereich mit einem beliebigen Objekt als Monitor.

32 Beispiel mit Lock p u b l i c c l a s s K o n f l i k t 2 extends Thread { p r i v a t e s t a t i c Lock l o c k = new ReentrantLock ( ) ; p r i v a t e s t a t i c double x p u b l i c void run ( ) { while (! i s I n t e r r u p t e d ( ) ) { double x_lokal = Math. random ( ) ; l o c k. l o c k ( ) ; x = x_lokal ; double summe = 0 ; f o r ( i n t i =0; i <100; i++) summe+=math. s i n (Math. ra i f ( x!= x_lokal ) System. out. p r i n t l n ( "Ups" ) ; l o c k. unlock ( ) ;

33 Das Interface Lock Das Interface Lock (dessen wichtigste Implementierung die Klasse ReentrantLock ist) besitzt folgende Methoden: void lock() wartet so lange, bis der kritische Bereich betreten werden kann und verriegelt ihn.

34 Das Interface Lock Das Interface Lock (dessen wichtigste Implementierung die Klasse ReentrantLock ist) besitzt folgende Methoden: void lock() wartet so lange, bis der kritische Bereich betreten werden kann und verriegelt ihn. boolean trylock() betritt den kritischen Bereich, falls er frei ist, und verriegelt ihn. Wartet nicht! Gibt true zurück, falls der Bereich betreten wurde, sonst false.

35 Das Interface Lock Das Interface Lock (dessen wichtigste Implementierung die Klasse ReentrantLock ist) besitzt folgende Methoden: void lock() wartet so lange, bis der kritische Bereich betreten werden kann und verriegelt ihn. boolean trylock() betritt den kritischen Bereich, falls er frei ist, und verriegelt ihn. Wartet nicht! Gibt true zurück, falls der Bereich betreten wurde, sonst false. boolean trylock(long time, TimeUnit unit) wartet die angegebene Zeit auf das Betreten, unterbrechbar.

36 Das Interface Lock Das Interface Lock (dessen wichtigste Implementierung die Klasse ReentrantLock ist) besitzt folgende Methoden: void lock() wartet so lange, bis der kritische Bereich betreten werden kann und verriegelt ihn. boolean trylock() betritt den kritischen Bereich, falls er frei ist, und verriegelt ihn. Wartet nicht! Gibt true zurück, falls der Bereich betreten wurde, sonst false. boolean trylock(long time, TimeUnit unit) wartet die angegebene Zeit auf das Betreten, unterbrechbar. void lockinterruptibly() wirkt wie lock, aber unterbrechbar.

37 Das Interface Lock Das Interface Lock (dessen wichtigste Implementierung die Klasse ReentrantLock ist) besitzt folgende Methoden: void lock() wartet so lange, bis der kritische Bereich betreten werden kann und verriegelt ihn. boolean trylock() betritt den kritischen Bereich, falls er frei ist, und verriegelt ihn. Wartet nicht! Gibt true zurück, falls der Bereich betreten wurde, sonst false. boolean trylock(long time, TimeUnit unit) wartet die angegebene Zeit auf das Betreten, unterbrechbar. void lockinterruptibly() wirkt wie lock, aber unterbrechbar. void unlock() entriegelt den kritischen Bereich.

38 Schützen mit synchronized Der alternative Weg zum Schutz eines kritischen Bereiches besteht in dem Verwenden von synchronized.

39 Schützen mit synchronized Der alternative Weg zum Schutz eines kritischen Bereiches besteht in dem Verwenden von synchronized. Hierbei kann ein Bereich als synchronisiert gekennzeichnet werden, der von keinem anderen Thread betreten werden darf, während er von einem Thread durchlaufen wird. Für die Synchronisation wird hierbei ein beliebiges Monitor-Objekt verwendet.

40 Schützen mit synchronized Der alternative Weg zum Schutz eines kritischen Bereiches besteht in dem Verwenden von synchronized. Hierbei kann ein Bereich als synchronisiert gekennzeichnet werden, der von keinem anderen Thread betreten werden darf, während er von einem Thread durchlaufen wird. Für die Synchronisation wird hierbei ein beliebiges Monitor-Objekt verwendet. Die grundlegende Syntax lautet dabei synchronized ( obj ) {.... (NB: Es ist natürlich sinnlos, ein Objekt als Monitor-Objekt zu verwenden, das je Thread lokal ist.)

41 Beispiel für synchronized p u b l i c c l a s s K o n f l i k t 3 extends Thread { p r i v a t e s t a t i c Object o = new Object ( ) ; p r i v a t e s t a t i c double x p u b l i c void run ( ) { while (! i s I n t e r r u p t e d ( ) ) { double x_lokal = Math. random ( ) ; synchronized ( o ) { x = x_lokal ; double summe = 0 ; f o r ( i n t i =0; i <100; i++) summe+=math. s i n (Mat i f ( x!= x_lokal ) System. out. p r i n t l n ( "Ups" ) ;

42 Beispiel Im Folgenden soll für ein reales Beispiel geprüft werden, wo die kritischen Bereiche liegen.

43 Beispiel Im Folgenden soll für ein reales Beispiel geprüft werden, wo die kritischen Bereiche liegen. Eine generische Klasse BoundedArrayList hat die Klasse ArrayList als Vorbild, soll aber die Zahl der Elemente in der Liste auf die Zahl max beschränken.

44 Code p u b l i c c l a s s BoundedArrayList<T> { p u b l i c f i n a l s t a t i c i n t max = 1 0 ; p r i v a t e Object [ ] data = new Object [ max ] ; i n t s i z e = 0 ; p u b l i c void add (T t ) { i f ( s i z e==max) throw new ArrayIndexOutOfBoundsExcepti data [ s i z e ++] = t ; p u b l i c void remove ( i n t index ) { i f ( index <0 index>=s i z e ) throw new ArrayIndexOutOfBoundsException ( index ) ; f o r ( i n t i=index ; i<s i z e - 1 ; i++) data [ i ]= data [ i +1]; data [ s i z e -1]= n u l l ; s i z e - - ;

45 Code p u b l i c T get ( i n t index ) { i f ( index <0 index>=s i z e ) throw new ArrayIndexOutOfBoundsException ( index ) ; return (T) data [ index ] ; p u b l i c void s e t ( i n t index, T t ) { i f ( index <0 index>=s i z e ) throw new ArrayIndexOutOfBoundsException ( index ) ; data [ index ] = t ; p u b l i c i n t g e t S i z e ( ) { return s i z e ;

46 Analyse Wo liegen hier nun die kritischen Bereiche? add prüft zunächst, ob die Liste voll ist, und hängt dann ein Element an. Was ist, wenn noch ein Platz frei ist, ein Thread erfolgreich prüft, dass noch Platz ist, aber vor dem Anhängen ein anderer Thread zuvor kommt und den letzten Platz schon belegt?

47 Analyse Wo liegen hier nun die kritischen Bereiche? add prüft zunächst, ob die Liste voll ist, und hängt dann ein Element an. Was ist, wenn noch ein Platz frei ist, ein Thread erfolgreich prüft, dass noch Platz ist, aber vor dem Anhängen ein anderer Thread zuvor kommt und den letzten Platz schon belegt? remove kopiert diverse Elemente hin und her. Hier wäre es fatal, wenn währenddessen ein anderer Thread etwas an einem dieser Element ändert.

48 Analyse Wo liegen hier nun die kritischen Bereiche? add prüft zunächst, ob die Liste voll ist, und hängt dann ein Element an. Was ist, wenn noch ein Platz frei ist, ein Thread erfolgreich prüft, dass noch Platz ist, aber vor dem Anhängen ein anderer Thread zuvor kommt und den letzten Platz schon belegt? remove kopiert diverse Elemente hin und her. Hier wäre es fatal, wenn währenddessen ein anderer Thread etwas an einem dieser Element ändert. get und set prüfen zuerst, ob der Index im gültigen Bereich liegt. Danach werden Operationen mit Datenelementen getätigt. Was ist, wenn zwischen Prüfen auf gültigen Index und Datenoperation in einem anderen Thread ein Element gelöscht wird?

49 Schützen kompletter Methoden Die Methoden add, remove, get und set sind komplett kritisch. Diese müssen also über das Objekt this synchronisiert werden.

50 Schützen kompletter Methoden Die Methoden add, remove, get und set sind komplett kritisch. Diese müssen also über das Objekt this synchronisiert werden. Dies kann z. B. wie folgt geschehen: p u b l i c void add (T t ) { synchronized ( t h i s ) { i f ( s i z e==max) throw new ArrayIndexOutOfBoundsException ( max ) ; data [ s i z e ++] = t ; oder kürzer p u b l i c synchronized void add (T t ) { i f ( s i z e==max) throw new ArrayIndexOutOfBoundsException ( max ) ; data [ s i z e ++] = t ;

51 Verklemmungen Solange es nur einen Lock bzw. nur ein Objekt gibt, über das kritische Bereiche synchronisiert werden, tauchen keine Probleme auf.

52 Verklemmungen Solange es nur einen Lock bzw. nur ein Objekt gibt, über das kritische Bereiche synchronisiert werden, tauchen keine Probleme auf. Gibt es aber z. B. mehrere Locks, so kann es in der Praxis zu Verklemmungen bzw. deadlocks kommen. Hier blockiert das Programm (oder ein Teil des Programms), wenn es zu einer Situation kommt, wo Threads einen Lock besitzen und darauf warten, dass ein anderer frei wird, dieser jedoch von einem Thread gehalten wird, der wieder darauf wartet, dass ein anderer frei wird,...

53 Das Philosophenproblem Eine solche Verklemmung wird musterhaft durch das Philosphenproblem beschrieben: Mehrere Philosophen sitzen an einem runden Tisch und wollen Spaghetti essen.

54 Das Philosophenproblem Eine solche Verklemmung wird musterhaft durch das Philosphenproblem beschrieben: Mehrere Philosophen sitzen an einem runden Tisch und wollen Spaghetti essen. Zwischen zwei Philosophen liegt jeweils eine Gabel, die beide sich teilen.

55 Das Philosophenproblem Eine solche Verklemmung wird musterhaft durch das Philosphenproblem beschrieben: Mehrere Philosophen sitzen an einem runden Tisch und wollen Spaghetti essen. Zwischen zwei Philosophen liegt jeweils eine Gabel, die beide sich teilen. Zum Essen laufen folgende Schritte ab:

56 Das Philosophenproblem Eine solche Verklemmung wird musterhaft durch das Philosphenproblem beschrieben: Mehrere Philosophen sitzen an einem runden Tisch und wollen Spaghetti essen. Zwischen zwei Philosophen liegt jeweils eine Gabel, die beide sich teilen. Zum Essen laufen folgende Schritte ab: Der Philosoph nimmt die linke Gabel in die Hand (ggfls. wartet er, bis sie frei ist),

57 Das Philosophenproblem Eine solche Verklemmung wird musterhaft durch das Philosphenproblem beschrieben: Mehrere Philosophen sitzen an einem runden Tisch und wollen Spaghetti essen. Zwischen zwei Philosophen liegt jeweils eine Gabel, die beide sich teilen. Zum Essen laufen folgende Schritte ab: Der Philosoph nimmt die linke Gabel in die Hand (ggfls. wartet er, bis sie frei ist), dann nimmt er die rechte Gabel in die Hand (sobald sie frei ist),

58 Das Philosophenproblem Eine solche Verklemmung wird musterhaft durch das Philosphenproblem beschrieben: Mehrere Philosophen sitzen an einem runden Tisch und wollen Spaghetti essen. Zwischen zwei Philosophen liegt jeweils eine Gabel, die beide sich teilen. Zum Essen laufen folgende Schritte ab: Der Philosoph nimmt die linke Gabel in die Hand (ggfls. wartet er, bis sie frei ist), dann nimmt er die rechte Gabel in die Hand (sobald sie frei ist), er isst, bis er satt ist,

59 Das Philosophenproblem Eine solche Verklemmung wird musterhaft durch das Philosphenproblem beschrieben: Mehrere Philosophen sitzen an einem runden Tisch und wollen Spaghetti essen. Zwischen zwei Philosophen liegt jeweils eine Gabel, die beide sich teilen. Zum Essen laufen folgende Schritte ab: Der Philosoph nimmt die linke Gabel in die Hand (ggfls. wartet er, bis sie frei ist), dann nimmt er die rechte Gabel in die Hand (sobald sie frei ist), er isst, bis er satt ist, beide Gabeln werden wieder abgelegt.

60 Das Philosophenproblem Eine solche Verklemmung wird musterhaft durch das Philosphenproblem beschrieben: Mehrere Philosophen sitzen an einem runden Tisch und wollen Spaghetti essen. Zwischen zwei Philosophen liegt jeweils eine Gabel, die beide sich teilen. Zum Essen laufen folgende Schritte ab: Der Philosoph nimmt die linke Gabel in die Hand (ggfls. wartet er, bis sie frei ist), dann nimmt er die rechte Gabel in die Hand (sobald sie frei ist), er isst, bis er satt ist, beide Gabeln werden wieder abgelegt. Nach dem Essen wird jeweils eine Denkpause eingelegt, bis der Philosoph wieder hungrig wird.

61 Schaubild Bild: Benjamin D. Esham, Wikipedia

62 Implementierung import java. u t i l. concurrent. l o c k s. Lock ; p u b l i c c l a s s Philosoph extends Thread { p r i v a t e Lock l i n k s ; p r i v a t e Lock r e c h t s ; p u b l i c Philosoph ( S t r i n g name, Lock l i n k s, Lock r e c h t s ) { super (name ) ; t h i s. l i n k s = l i n k s ; t h i s. r e c h t s = r e c h t s ; p r i v a t e void debug ( S t r i n g message ) { System. out. p r i n t l n ( getname()+" : "+message ) ;

63 Implementierung (Gabeln nehmen, hinlegen) p r i v a t e void nehmegabeln ( ) throws InterruptedException { l i n k s. l o c k ( ) ; // Zwischen dem Aufnehmen der Gabeln v e r g e h t etwas Z Thread. s l e e p ( 5 ) ; r e c h t s. l o c k ( ) ; p r i v a t e void legegabelnhin ( ) { l i n k s. unlock ( ) ; r e c h t s. unlock ( ) ;

64 Implementierung (Essen, denken) p r i v a t e void e s s e ( ) throws InterruptedException { i n t dauer ; // Esse f ü r b i s zu 100ms dauer = ( i n t ) (100*Math. random ( ) ) ; debug ( " Essen f ü r "+dauer+"ms" ) ; Thread. s l e e p ( dauer ) ; p r i v a t e void denke ( ) throws InterruptedException { i n t dauer ; // Denke f ü r b i s zu 100ms dauer = ( i n t ) (100*Math. random ( ) ) ; debug ( "Denken f ü r "+dauer+"ms" ) ; Thread. s l e e p ( dauer ) ;

65 Implementierung p u b l i c void run ( ) { while (! i s I n t e r r u p t e d ( ) ) { try { debug ( "Gabeln aufnehmen" ) ; nehmegabeln ( ) ; e s s e ( ) ; debug ( "Gabeln h i n l e g e n " ) ; legegabelnhin ( ) ; denke ( ) ; catch ( InterruptedException e ) { legegabelnhin ( ) ; i n t e r r u p t ( ) ;

66 Analyse Im einfachsten Fall kann man mit zwei Philosophen arbeiten, die sich gegenüber sitzen: Lock l 1 = new ReentrantLock ( ) ; Lock l 2 = new ReentrantLock ( ) ; new Philosoph ( "P1", l1, l 2 ). s t a r t ( ) ; Thread. s l e e p ( 3 0 ) ; new Philosoph ( "P2", l2, l 1 ). s t a r t ( ) ;

67 Analyse Im einfachsten Fall kann man mit zwei Philosophen arbeiten, die sich gegenüber sitzen: Lock l 1 = new ReentrantLock ( ) ; Lock l 2 = new ReentrantLock ( ) ; new Philosoph ( "P1", l1, l 2 ). s t a r t ( ) ; Thread. s l e e p ( 3 0 ) ; new Philosoph ( "P2", l2, l 1 ). s t a r t ( ) ; Beim Ausführen bemerkt man, dass nach mehr oder weniger langer Zeit keiner der Philosophen mehr essen kann. Denn beide halten die linke Gabel in der Hand und warten auf die rechte die dummerweise gerade vom anderen Philosophen festgehalten wird.

68 Lösungsmöglichkeit Die Ursache für die Verklemmung in diesem Fall liegt in der Reihenfolge des Aufnehmens der Gabeln. Um diese aufzulösen, kann man eine Goldene Gabel einführen, die grundsätzlich zuerst aufgenommen werden muss, auch wenn sie rechts liegt.

69 Lösungsmöglichkeit Die Ursache für die Verklemmung in diesem Fall liegt in der Reihenfolge des Aufnehmens der Gabeln. Um diese aufzulösen, kann man eine Goldene Gabel einführen, die grundsätzlich zuerst aufgenommen werden muss, auch wenn sie rechts liegt. Übrigens reicht auch bei mehr als zwei Philosophen eine einzige goldene Gabel aus.

70 Lösungsmöglichkeit Die Ursache für die Verklemmung in diesem Fall liegt in der Reihenfolge des Aufnehmens der Gabeln. Um diese aufzulösen, kann man eine Goldene Gabel einführen, die grundsätzlich zuerst aufgenommen werden muss, auch wenn sie rechts liegt. Übrigens reicht auch bei mehr als zwei Philosophen eine einzige goldene Gabel aus. Dies bedeutet: Letztlich ist ein einziger Philosoph (der links von der goldenen Gabel) dafür verantwortlich, ob alle Philosophen verhungern müssen oder nicht!

71 Strategie zur Implementierung Zur Lösung wird nur eine neue Klasse geschaffen: p u b l i c c l a s s GoldenLock extends ReentrantLock { Diese dient rein zur Markierung einer Gabel als golden.

72 Strategie zur Implementierung Zur Lösung wird nur eine neue Klasse geschaffen: p u b l i c c l a s s GoldenLock extends ReentrantLock { Diese dient rein zur Markierung einer Gabel als golden. Nun wird in der Methode nehmegabeln() sichergestellt, dass abweichend vom Normalfall die rechte Gabel zuerst aufgenommen wird, wenn sie aus Gold ist.

73 Änderung in nehmegabeln() p r i v a t e void nehmegabeln ( ) throws InterruptedException { Lock f i r s t ; Lock second ; i f ( r e c h t s i n s t a n c e o f GoldenLock ) { f i r s t = r e c h t s ; second = l i n k s ; e l s e { f i r s t = l i n k s ; second = r e c h t s ; f i r s t. l o c k ( ) ; // Zwischen dem Aufnehmen der Gabeln vergeht etwas Z e i t Thread. s l e e p ( 2 0 ) ; second. l o c k ( ) ;

74 Austausch von Signalen über Threads In den bisherigen Beispielen wurde direkt mit den Lock-Objekten gearbeitet.

75 Austausch von Signalen über Threads In den bisherigen Beispielen wurde direkt mit den Lock-Objekten gearbeitet. Zusätzlich existiert aber die Möglichkeit, dass Threads sich gezielt schlafen legen können, bis sie von einem anderen Thread benachrichtigt werden, dass sie ihre Arbeit fortsetzen können.

76 Austausch von Signalen über Threads In den bisherigen Beispielen wurde direkt mit den Lock-Objekten gearbeitet. Zusätzlich existiert aber die Möglichkeit, dass Threads sich gezielt schlafen legen können, bis sie von einem anderen Thread benachrichtigt werden, dass sie ihre Arbeit fortsetzen können. Dies wird seit Java 1.0 über die Methoden wait und notify angeboten. Seit Java 5 kann man aber Objekte vom Typ Condition verwenden, die weitere Möglichkeiten und mehr Komfort bieten.

77 Das Interface Condition Objekte, die Condition implementieren, stellen folgende Methoden zur Verfügung await() Diese Methode legt den aktuellen Thread schlafen und sorgt dafür, dass er wieder aufwacht, wenn er über das Condition-Objekt benachrichtigt wird.

78 Das Interface Condition Objekte, die Condition implementieren, stellen folgende Methoden zur Verfügung await() Diese Methode legt den aktuellen Thread schlafen und sorgt dafür, dass er wieder aufwacht, wenn er über das Condition-Objekt benachrichtigt wird. signal() weckt einen Thread auf, der auf das Condition-Objekt wartet.

79 Das Interface Condition Objekte, die Condition implementieren, stellen folgende Methoden zur Verfügung await() Diese Methode legt den aktuellen Thread schlafen und sorgt dafür, dass er wieder aufwacht, wenn er über das Condition-Objekt benachrichtigt wird. signal() weckt einen Thread auf, der auf das Condition-Objekt wartet. signalall() benachrichtigt alle schlafenden Threads.

80 Das Interface Condition Objekte, die Condition implementieren, stellen folgende Methoden zur Verfügung await() Diese Methode legt den aktuellen Thread schlafen und sorgt dafür, dass er wieder aufwacht, wenn er über das Condition-Objekt benachrichtigt wird. signal() weckt einen Thread auf, der auf das Condition-Objekt wartet. signalall() benachrichtigt alle schlafenden Threads.

81 Das Interface Condition Objekte, die Condition implementieren, stellen folgende Methoden zur Verfügung await() Diese Methode legt den aktuellen Thread schlafen und sorgt dafür, dass er wieder aufwacht, wenn er über das Condition-Objekt benachrichtigt wird. signal() weckt einen Thread auf, der auf das Condition-Objekt wartet. signalall() benachrichtigt alle schlafenden Threads. Condition-Objekte werden von Lock-Objekten erzeugt: Lock l o c k = new ReentrantLock ( ) ; Condition cond = l o c k. newcondition ( ) ; Von await existieren zeitgesteuerte Varianten analog zu trylock.

82 Vorgehen Erzeugen eines Lock-Objekts lock

83 Vorgehen Erzeugen eines Lock-Objekts lock Erzeugen eines Condition-Objekts: Condition cond = lock.newcondition()

84 Vorgehen Erzeugen eines Lock-Objekts lock Erzeugen eines Condition-Objekts: Condition cond = lock.newcondition() Threads dürfen nur dann in Warteposition geschoben werden, wenn sie den Lock besitzen. Es muss also zunächst lock. lock() aufgerufen werden!

85 Vorgehen Erzeugen eines Lock-Objekts lock Erzeugen eines Condition-Objekts: Condition cond = lock.newcondition() Threads dürfen nur dann in Warteposition geschoben werden, wenn sie den Lock besitzen. Es muss also zunächst lock. lock() aufgerufen werden! Mit cond.await() wird gewartet (und der Lock wieder freigegeben!), bis der Thread von einem anderen mit cond.signal () bzw. cond.signalall () benachrichtigt wird.

86 Vorgehen Erzeugen eines Lock-Objekts lock Erzeugen eines Condition-Objekts: Condition cond = lock.newcondition() Threads dürfen nur dann in Warteposition geschoben werden, wenn sie den Lock besitzen. Es muss also zunächst lock. lock() aufgerufen werden! Mit cond.await() wird gewartet (und der Lock wieder freigegeben!), bis der Thread von einem anderen mit cond.signal () bzw. cond.signalall () benachrichtigt wird. Der Thread wartet nun, bis er den Lock wieder hat und setzt die Arbeit fort.

87 Vorgehen Erzeugen eines Lock-Objekts lock Erzeugen eines Condition-Objekts: Condition cond = lock.newcondition() Threads dürfen nur dann in Warteposition geschoben werden, wenn sie den Lock besitzen. Es muss also zunächst lock. lock() aufgerufen werden! Mit cond.await() wird gewartet (und der Lock wieder freigegeben!), bis der Thread von einem anderen mit cond.signal () bzw. cond.signalall () benachrichtigt wird. Der Thread wartet nun, bis er den Lock wieder hat und setzt die Arbeit fort. Am Ende das lock. unlock() nicht vergessen!

88 Beispiel: Erzeuger und Verbraucher Im folgenden Beispiel soll ein System aus Erzeugern und Verbrauchern realisiert werden. Zentraler Punkt ist eine Warteschlange, die Daten aufnehmen und wieder abgeben kann.

89 Beispiel: Erzeuger und Verbraucher Im folgenden Beispiel soll ein System aus Erzeugern und Verbrauchern realisiert werden. Zentraler Punkt ist eine Warteschlange, die Daten aufnehmen und wieder abgeben kann. Mehrere Erzeuger können dort Daten abliefern.

90 Beispiel: Erzeuger und Verbraucher Im folgenden Beispiel soll ein System aus Erzeugern und Verbrauchern realisiert werden. Zentraler Punkt ist eine Warteschlange, die Daten aufnehmen und wieder abgeben kann. Mehrere Erzeuger können dort Daten abliefern. Mehrere Verbraucher können Daten abholen.

91 Beispiel: Erzeuger und Verbraucher Im folgenden Beispiel soll ein System aus Erzeugern und Verbrauchern realisiert werden. Zentraler Punkt ist eine Warteschlange, die Daten aufnehmen und wieder abgeben kann. Mehrere Erzeuger können dort Daten abliefern. Mehrere Verbraucher können Daten abholen. Falls die Schlange voll ist, warten die Erzeuger, bis ein Verbraucher Nachricht gibt, dass er ein Element entfernt hat.

92 Beispiel: Erzeuger und Verbraucher Im folgenden Beispiel soll ein System aus Erzeugern und Verbrauchern realisiert werden. Zentraler Punkt ist eine Warteschlange, die Daten aufnehmen und wieder abgeben kann. Mehrere Erzeuger können dort Daten abliefern. Mehrere Verbraucher können Daten abholen. Falls die Schlange voll ist, warten die Erzeuger, bis ein Verbraucher Nachricht gibt, dass er ein Element entfernt hat. Ist die Schlange leer, warten die Verbraucher, bis ein Erzeuger Nachricht gibt, dass er ein Element erzeugt hat.

93 Klasse WarteSchlange p u b l i c c l a s s WarteSchlange { p r i v a t e f i n a l i n t MAX = 1 0 ; p r i v a t e Queue<String > daten = new LinkedList <String >(); Lock l o c k = new ReentrantLock ( ) ; Condition n i c h t V o l l = l o c k. newcondition ( ) ; Condition nichtleer = l o c k. newcondition ( ) ; p u b l i c void f u e l l e ( S t r i n g s ) throws InterruptedException l o c k. l o c k ( ) ; try { while ( daten. s i z e ()==MAX) n i c h t V o l l. await ( ) ; daten. add ( s ) ; nichtleer. s i g n a l A l l ( ) ; f i n a l l y { l o c k. unlock ( ) ;

94 Klasse WarteSchlange (Forts.) p u b l i c S t r i n g l e e r e ( ) throws InterruptedException { l o c k. l o c k ( ) ; try { while ( daten. s i z e ()==0) nichtleer. await ( ) ; S t r i n g r e s u l t = daten. p o l l ( ) ; n i c h t V o l l. s i g n a l A l l ( ) ; return r e s u l t ; f i n a l l y { l o c k. unlock ( ) ;

95 Klasse Erzeuger p u b l i c c l a s s Erzeuger extends Thread { p r i v a t e WarteSchlange q ; p u b l i c Erzeuger ( S t r i n g name, WarteSchlange q ) { super (name ) ; t h i s. q = q p u b l i c void run ( ) { while (! i s I n t e r r u p t e d ( ) ) { try { Date date = new Date ( ) ; S t r i n g msg = S t r i n g. format ( "%tt %10.8 f ", date, Math. System. out. p r i n t l n ( getname()+" s c h r e i b t "+msg ) ; q. f u e l l e (msg ) ; Thread. s l e e p ( ( i n t ) ( Math. random ( ) * ) ) ; catch ( InterruptedException e ) { i n t e r r u p t ( ) ;

96 Klasse Verbraucher p u b l i c c l a s s Verbraucher extends Thread { p r i v a t e WarteSchlange daten ; p u b l i c Verbraucher ( S t r i n g name, WarteSchlange daten ) { super (name ) ; t h i s. daten = daten p u b l i c void run ( ) { while (! i s I n t e r r u p t e d ( ) ) { try { System. out. p r i n t l n ( getname()+" e r h i e l t "+daten. l e e Thread. s l e e p ( ( i n t ) (Math. random ( ) * ) ) ; catch ( InterruptedException e ) { i n t e r r u p t ( ) ;

97 Klasse Main p u b l i c c l a s s Main { p r i v a t e f i n a l s t a t i c WarteSchlange q = new WarteSchlange ( p u b l i c s t a t i c void main ( S t r i n g [ ] args ) { new Erzeuger ( "E1", q ). s t a r t ( ) ; new Erzeuger ( "E2", q ). s t a r t ( ) ; new Verbraucher ( "V1", q ). s t a r t ( ) ; new Verbraucher ( "V2", q ). s t a r t ( ) ; new Verbraucher ( "V3", q ). s t a r t ( ) ;

98 Analyse Die beiden interessanten Punkte der Anwendung liegen an den Stellen, an denen die Erzeuger bzw. Verbraucher schlafen gelegt werden: while (daten. size()==max) nichtvoll.await(); while (daten. size()==0) nichtleer.await();

99 Analyse Die beiden interessanten Punkte der Anwendung liegen an den Stellen, an denen die Erzeuger bzw. Verbraucher schlafen gelegt werden: while (daten. size()==max) nichtvoll.await(); while (daten. size()==0) nichtleer.await(); Warum while und nicht if?

100 Analyse (Forts.) Wird ein Element verbraucht, so werden mit nichtvoll. signalall () alle wartenden Erzeuger benachrichtigt, dass wieder ein Platz frei ist. Nun bekommt einer der Erzeuger zufällig als erstes den Lock wieder und erzeugt ein neues Element. Kommt dann der nächste Erzeuger wieder daran, kann es sein, dass trotz Signals die Schlange also immer noch voll ist, wenn zwischenzeitlich kein anderer Verbraucher dran kam. Daher muss geprüft werden, ob der Thread nicht direkt weiter warten muss!

101 Analyse (Forts.) Wird ein Element verbraucht, so werden mit nichtvoll. signalall () alle wartenden Erzeuger benachrichtigt, dass wieder ein Platz frei ist. Nun bekommt einer der Erzeuger zufällig als erstes den Lock wieder und erzeugt ein neues Element. Kommt dann der nächste Erzeuger wieder daran, kann es sein, dass trotz Signals die Schlange also immer noch voll ist, wenn zwischenzeitlich kein anderer Verbraucher dran kam. Daher muss geprüft werden, ob der Thread nicht direkt weiter warten muss! Die gleiche Logik gilt bei den Verbrauchern. Hier muss ebenfalls geprüft werden, ob das gerade angekommene Element nicht schon von einem anderen Verbraucher genommen wurde.

Nebenläufigkeit mit Java

Nebenläufigkeit mit Java Nebenläufigkeit mit Java Einheit 03: Synchronisation Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda Synchronisation von Threads Locks Java Monitor-Konzept Lock Freigabe Zusammenspiel

Mehr

Ausnahmebehandlung in Java

Ausnahmebehandlung in Java Ausnahmebehandlung in Java class A { void foo() throws Help, SyntaxError {... class B extends A { void foo() throws Help { if (helpneeded()) throw new Help();... try {... catch (Help e) {... catch (Exception

Mehr

Nebenläufige Programmierung in Java: Threads

Nebenläufige Programmierung in Java: Threads Nebenläufige Programmierung in Java: Threads Wahlpflicht: Fortgeschrittene Programmierung in Java Jan Henke HAW Hamburg 10. Juni 2011 J. Henke (HAW) Threads 10. Juni 2011 1 / 18 Gliederung 1 Grundlagen

Mehr

Linux Prinzipien und Programmierung

Linux Prinzipien und Programmierung Linux Prinzipien und Programmierung Dr. Klaus Höppner Hochschule Darmstadt Sommersemester 2014 1 / 28 Kritische Bereiche bei Threads Deadlocks Conditions/Semaphore 2 / 28 Beispiel aus der letzten Vorlesung

Mehr

Beispiel für überladene Methode

Beispiel für überladene Methode Beispiel für überladene Methode class Gras extends Futter {... abstract class Tier { public abstract void friss (Futter x); class Rind extends Tier { public void friss (Gras x) {... public void friss (Futter

Mehr

Algorithmen und Datenstrukturen II

Algorithmen und Datenstrukturen II Algorithmen und Datenstrukturen II Bioinformatics Resource Facility Center for Biotechnology Vorlesung Sommer 2010 Teil I Nebenläufigkeit (Threads) Multitasking moderne Betriebssysteme (Solaris, MacOS

Mehr

Praktikum aus Softwareentwicklung 2, Stunde 5

Praktikum aus Softwareentwicklung 2, Stunde 5 Praktikum aus Softwareentwicklung 2, Stunde 5 Lehrziele/Inhalt 1. Threads Threads Threads sind parallele, oder auf Rechnern mit nur einer CPU quasi-parallele, Programmabläufe in Java. Sie können beispielsweise

Mehr

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces Programmieren I Martin Schultheiß Hochschule Darmstadt Wintersemester 2010/2011 1 / 20 Polymorphie/Späte Bindung Abstrakte Klassen Interfaces 2 / 20 Definition: Polymorphie Der Begriff Polymorphie (manchmal

Mehr

Dr. Monika Meiler. Inhalt

Dr. Monika Meiler. Inhalt Inhalt 15 Parallele Programmierung... 15-2 15.1 Die Klasse java.lang.thread... 15-2 15.2 Beispiel 0-1-Printer als Thread... 15-3 15.3 Das Interface java.lang.runnable... 15-4 15.4 Beispiel 0-1-Printer

Mehr

Einfache Liste: Ein Stapel (Stack) Ansatz. Schaubild. Vorlesung 1. Handout S. 2. Die einfachste Form einer Liste ist ein Stapel (stack).

Einfache Liste: Ein Stapel (Stack) Ansatz. Schaubild. Vorlesung 1. Handout S. 2. Die einfachste Form einer Liste ist ein Stapel (stack). Programmieren I Martin Schultheiß Hochschule Darmstadt Sommersemester 2011 1 / 64 2 / 64 Motivation Hauptteil dieser Vorlesung sind die so genannten. Zur Motivation (und als Vorbereitung der Datencontainer-Klassen

Mehr

Übung zu Grundlagen der Betriebssysteme. 10. Übung 18.12.2012

Übung zu Grundlagen der Betriebssysteme. 10. Übung 18.12.2012 Übung zu Grundlagen der Betriebssysteme 10. Übung 18.12.2012 Aufgabe 1 a) Was versteht man unter einem kritischen Abschnitt oder kritischen Gebiet (critical area)? b) Welche Aufgabe hat ein Semaphor? c)

Mehr

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

Thread-Synchronisation in in Java. Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen Thread-Synchronisation in in Java Threads Wechselseitiger Ausschluss Bedingte Synchronisation Beispiel: Warteschlangen Die Klasse Thread Die Die Klasse Thread gehört zur zur Standardbibliothek von von

Mehr

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

Prozesse. Prozesse sind Programme. Prozesse können aus Unterprozessen bestehen. Prozesshierarchie Unterprozesse Threads Threads Prozesse, Parallelität, Nebenläufigkeit, Threads, Erzeugung, Ausführung, Kommunikation, Interferenz, Kritischer Bereich, Deadlock, Synchronisation. Prozesse Prozesse sind Programme mehrere Prozesse

Mehr

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

Zur Erinnerung: Threads. Threadverwaltung. Threads: Prioritäten. Beispiel Flugbuchungsprogramm. Nichtdeterminismus Zur Erinnerung: Threads Programmierung (fortgeschrittene Konzepte) Threads, Monitore, Semaphore und speisende en Wolf-Ulrich Raffel (uli@wuraffel.de) Möglichkeiten, Threads zu definieren Bildung einer

Mehr

Parallele Prozesse. Prozeß wartet

Parallele Prozesse. Prozeß wartet Parallele Prozesse B-66 Prozeß: Ausführung eines Programmes in seinem Adressraum (zugeordneter Speicher) Parallele Prozesse: gleichzeitig auf mehreren Prozessoren laufende Prozesse p1 p2 verzahnte Prozesse:

Mehr

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

Überblick. Verteilte Systeme - Übung. Was ist ein Thread? Threads in Java. Multithreading in Java Threads Synchronisation Koordinierung Überblick Verteilte Systeme - Übung Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme) www4.informatik.uni-erlangen.de Sommersemester 2009

Mehr

Java I Vorlesung Nebenläufigkeit

Java I Vorlesung Nebenläufigkeit Java I Vorlesung 10 Nebenläufigkeit 28.6.2004 Threads Synchronisation Deadlocks Thread-Kommunikation Innere Klassen Anonyme Klassen Nebenläufigkeit http://java.sun.com/docs/books/tutorial/essential/threads/

Mehr

Vorlesung Informatik II

Vorlesung Informatik II Vorlesung Informatik II Universität Augsburg Wintersemester 2011/2012 Prof. Dr. Bernhard Bauer Folien von: Prof. Dr. Robert Lorenz Lehrprofessur für Informatik 17. JAVA Kommunikation von Threads 1 Motivation

Mehr

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

Muster nebenläufiger Programmierung. concurrent Packet von Java. Alois Schü;e AOSD 1 Muster nebenläufiger Programmierung concurrent Packet von Java Alois Schü;e AOSD 1 Concurrent Packet In diesem Teil der Veranstaltung werde Muster nebenläufiger Programmierung diskueert. Dazu wird das

Mehr

Ausgewählte Implementierungsprobleme

Ausgewählte Implementierungsprobleme Ausgewählte Implementierungsprobleme Rebecca Tiarks 18. Dezember 2008 1 / 30 Inhaltsverzeichnis 1 2 3 Persistenzproblem & CSV Binärformat 2 / 30 Themenübersicht 1 18. Dez: + 2 8. Jan. Swing 3 15. Jan TCP,

Mehr

Einführung in die Programmierung Blockkurs Java

Einführung in die Programmierung Blockkurs Java Michael Bader 8. 12. April 2002 Freitag Inhaltsübersicht Exceptions und Errors Ausnahmebehandlung: try/catch/finally Threads Zugriffskontrolle bei gemeinsamen Variablen: synchronized, wait(), notify()

Mehr

Parallele und funktionale Programmierung Wintersemester 2015/ Übung Abgabe bis , 10:00 Uhr

Parallele und funktionale Programmierung Wintersemester 2015/ Übung Abgabe bis , 10:00 Uhr 3. Übung Abgabe bis 10.11.2015, 10:00 Uhr Aufgabe 3.1: Java-Synchronisation a) An welchen Stellen im Code kann das Schlüsselwort synchronized verwendet werden? b) Wie nennt sich die Synchronisations-Art,

Mehr

Nebenläufigkeit mit Java

Nebenläufigkeit mit Java Nebenläufigkeit mit Java Einheit 02: Eigenschaften & kritische Abläufe Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda Eigenschaften von Threads Name, Priorität, Zustand Zustandsübergänge

Mehr

Programmieren in Java -Eingangstest-

Programmieren in Java -Eingangstest- Programmieren in Java -Eingangstest- Nummer: 1. Studiengang: Informatik B.Sc. Informatik M.Sc. ESE B.Sc. ESE M.Sc. Sonstiges: Fachsemester: Bitte Fragen, die Sie nicht beantworten können unbedingt mit

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 15 Einstieg in die Informatik mit Java Collections Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 15 1 Überblick Collections 2 Hierarchie von Collections 3 Verwendung

Mehr

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

Parallele und funktionale Programmierung Wintersemester 2016/ Übung Abgabe bis , 16:00 Uhr 4. Übung Abgabe bis 25.11.2016, 16:00 Uhr Aufgabe 4.1: Verklemmungsbedingungen a) Welche drei Bedingungen müssen gelten, damit es zu einer Verklemmung in einem parallelen System kommen kann? b) Nach welcher

Mehr

Synchronisation in Java. Invisible Web

Synchronisation in Java. Invisible Web Synchronisation in Java Studienprojekt Invisible Web Tang Zhihong Synchronisation in Java Synchronisationsproblem Monitore Wait und notify PipedInputStream und PipedOutputStream Synchronisation von Collections

Mehr

2.2 Prozesse in Java

2.2 Prozesse in Java 2.2 Prozesse in Java! Java sieht kein Schlüsselwort für Prozesse vor, sondern bestimmte Klassen und Schnittstellen. Mit anderen Worten: der Prozessbegriff wird mit Mitteln der Objektorientierung eingeführt.

Mehr

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

Überblick. Generische Datenstrukturen. Traversieren von Datenstrukturen. Package: java.util Überblick Collections Übersicht Package: java.util Java Collections & Maps Threads Gemeinsame Schnittstelle: Collection Datenstrukturen Menge Schnittstelle: Set Implementierungen: HashSet, TreeSet,...

Mehr

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

Überblick. Java Collections & Maps Threads Synchronisation Koordinierung. MW-Übung (WS11/12) Java Collections & Maps 2 1 Überblick Java Collections & Maps Threads Synchronisation Koordinierung MW-Übung (WS11/12) Java Collections & Maps 2 1 Collections Übersicht Package: java.util Gemeinsame Schnittstelle: Collection Datenstrukturen

Mehr

EINFÜHRUNG IN DIE PROGRAMMIERUNG

EINFÜHRUNG IN DIE PROGRAMMIERUNG EINFÜHRUNG IN DIE PROGRAMMIERUNG FORTGESCHRITTENE KONZEPTE Tobias Witt 26.03.2014 tobias.witt@hhu.de 25.12.01.30 Bürozeiten: 09 Uhr - 12 Uhr FEHLERBEHANDLUNG KLASSISCHER ANSATZ Fehlercode als Rückgabewert

Mehr

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

Thread-Konzept in objektorientierten Programmiersprachen. Threads. Threads in Java Thread-Konzept in objektorientierten Programmiersprachen 1 Threads ein Thread ist ein eigenständiges Programmfragment, das parallel zu anderen Teilen eines Programmes ablaufen kann alle Threads eines Programmes

Mehr

Programmierung mit Threads in Java

Programmierung mit Threads in Java Programmierung mit Threads in Java Harald Kosch and Matthias Ohlenroth Institut für Informationstechnologie Universität Klagenfurt H. Kosch Threads in Java 1 Inhalt Grundlagen: Threads und Datenlokalität

Mehr

Universität Potsdam Institut für Informatik Sommersemester Programmierung. Lehrblatt Woche 11

Universität Potsdam Institut für Informatik Sommersemester Programmierung. Lehrblatt Woche 11 Universität Potsdam Institut für Informatik Sommersemester 2014 Programmierung Lehrblatt Woche 11 1 Applets In den letzten Wochen haben Sie die graphische Programmierung kennengelernt. Um Java-Programme

Mehr

Verteilte Systeme CS5001

Verteilte Systeme CS5001 Verteilte Systeme CS5001 Th. Letschert TH Mittelhessen Gießen University of Applied Sciences Client-Server-Anwendungen: Vom passiven (shared state) Monitor zum aktiven Monitor Monitor (Hoare, Brinch-Hansen,

Mehr

JJ Prozesse und Nebenläufigkeit

JJ Prozesse und Nebenläufigkeit 1 Wiederholung: Algorithmus von Peterson boolean ready0=false, ready1=false; int turn=0; JJ Prozesse und Nebenläufigkeit (Auszug aus der Vorlesung) while( 1 ) Prozess 0 ready0 = true; turn = 1; while(

Mehr

5. Threads, Serverprozesse und Benachrichtigungen

5. Threads, Serverprozesse und Benachrichtigungen 5. Threads, Serverprozesse und Benachrichtigungen Threads allgemein Threads in Android: Handler und Messages Services: Local, Remote, Binding Benachrichtigungen Entwicklung mobiler Anwendungen Europäische

Mehr

Interface. So werden Interfaces gemacht

Interface. So werden Interfaces gemacht Design Ein Interface (=Schnittstelle / Definition) beschreibt, welche Funktionalität eine Implementation nach Aussen anzubieten hat. Die dahinter liegende Algorithmik wird aber der Implementation überlassen.

Mehr

Java Concurrency Utilities

Java Concurrency Utilities Java Concurrency Utilities Java unterstützt seit Java 1.0 Multithreading Java unterstützt das Monitorkonzept mittels der Schlüsselworte synchronized und volatile sowie den java.lang.object Methoden wait(),

Mehr

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

Threads In dieser Übung beschäftigen wir uns mit der Realisierung von Threads in Java. Threads In dieser Übung beschäftigen wir uns mit der Realisierung von Threads in Java. Aufgabe 1: Erzeugen und Starten von Threads a) Sei BankKunde eine von einer Klasse Kunde abgeleitete Klasse. Erweitern

Mehr

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

Parallele Prozesse Prozeß Parallele Prozesse verzahnte Prozesse Nebenläufige Prozesse: Threads Vorlesung Software-Entwicklung / Folie 131 Ziele: Parallele Prozesse SWE-131 Prozeß: Ausführung eines sequentiellen Programmstückes in dem zugeordneten Speicher (Adressraum). Veränderlicher Zustand: Speicherinhalt und Programmposition. Parallele Prozesse:

Mehr

FAKULTÄT FÜR INFORMATIK

FAKULTÄT FÜR INFORMATIK TECHNISCHE UNIVERSITÄT MÜNCHEN FAKULTÄT FÜR INFORMATIK Lehrstuhl für Sprachen und Beschreibungsstrukturen WS 2006/2007 Praktikum Grundlagen der Programmierung Lösungsvorschläge zu Blatt 11 F. Forster,

Mehr

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

Institut für Programmierung und Reaktive Systeme. Java 6. Markus Reschke Institut für Programmierung und Reaktive Systeme Java 6 Markus Reschke 13.10.2014 OOP Objekte = Verhalten (durch Methoden) + Daten (durch Attribute) Klassen = Baupläne für Objekte Kapselung von Programmteilen

Mehr

12 Abstrakte Klassen, finale Klassen und Interfaces

12 Abstrakte Klassen, finale Klassen und Interfaces 12 Abstrakte Klassen, finale Klassen und Interfaces Eine abstrakte Objekt-Methode ist eine Methode, für die keine Implementierung bereit gestellt wird. Eine Klasse, die abstrakte Objekt-Methoden enthält,

Mehr

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

Dezentrale Kontrolle: Aktive Objekte. Aktive Objekte Die Klasse AnimatorThread Aktivierung Objekte beobachten Die Java-Klasse Thread Dezentrale Kontrolle: Aktive Objekte Aktive Objekte Die Klasse AnimatorThread Aktivierung Objekte beobachten Die Java-Klasse Thread Passive Objekte Bieten Dienste auf Abruf an: - eine Zahl von der Konsole

Mehr

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober Klausur II

Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober Klausur II Universität Augsburg, Institut für Informatik Sommersemester 2001 Prof. Dr. Martin Ester 08. Oktober 2001 Stefan Holland Informatik II Hinweise: Klausur II Verwenden Sie für Ihre Lösungen ausschließlich

Mehr

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

Threads - und wie sie in Java implementiert sind. Vortrag von Lukas Klimmasch, Stefan Lang und Ralf Schmidt Jena, den Threads - und wie sie in Java implementiert sind Vortrag von Lukas Klimmasch, Stefan Lang und Ralf Schmidt Jena, den 05.12.2011 Was ist ein Thread? laut Wikipedia: ein Ausführungsstrang oder eine in der

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Abstrakte Klassen und Methoden & Interfaces Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck http://www.itm.uni-luebeck.de/people/fischer #2 Vererbungshierarchie

Mehr

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

Institut für Informatik. Endterm Klausur zu Informatik I 20. Februar 2010 Technische Universität München Institut für Informatik Lehrstuhl für Computer Graphik & Visualisierung Prof. R. Westermann Endterm Klausur zu Informatik I 20. Februar 2010 ˆ Die Arbeitszeit beträgt 120

Mehr

Javakurs für Anfänger

Javakurs für Anfänger Javakurs für Anfänger Einheit 13: Interfaces Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme 1. Teil: Interfaces Motivation Eigenschaften Besonderheiten Anonyme Klassen Lambda-Ausdrücke Praxis:

Mehr

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally

1 Organisatorisches. 2 Compilezeit- und Laufzeitfehler. 3 Exceptions. 4 Try-Catch-Finally Themen der Übung CoMa-Übung VI 1 Organisatorisches Compilezeit- und Laufzeitfehler 3 Try-Catch-Finally TU Berlin 8.11.01 Bewertung der OA 5 fehlerhaft, Madeleine arbeitet dran CoMa-Übung VI (TU Berlin)

Mehr

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

Verteilte Systeme. 2. Die Client-Server-Beziehung und daraus resultierende Techniken. 2.2 Nebenläufigkeitstechniken in Java VS22 Slide 1 Verteilte Systeme 2. Die Client-Server-Beziehung und daraus resultierende Techniken 2.2 Nebenläufigkeitstechniken in Java Sebastian Iwanowski FH Wedel VS22 Slide 2 Was ist Nebenläufigkeit?

Mehr

Exceptions. CoMa-Übung VII TU Berlin. CoMa-Übung VII (TU Berlin) Exceptions / 1

Exceptions. CoMa-Übung VII TU Berlin. CoMa-Übung VII (TU Berlin) Exceptions / 1 Exceptions CoMa-Übung VII TU Berlin 7.11.013 CoMa-Übung VII (TU Berlin) Exceptions 7.11.013 1 / 1 Themen der Übung 1 Compilezeit- und Laufzeitfehler Exceptions 3 Try-Catch-Finally CoMa-Übung VII (TU Berlin)

Mehr

Monitore. Klicken bearbeiten

Monitore. Klicken bearbeiten Sascha Kretzschmann Institut für Informatik Monitore Formatvorlage und deren Umsetzung des Untertitelmasters durch Klicken bearbeiten Inhalt 1. Monitore und Concurrent Pascal 1.1 Warum Monitore? 1.2 Monitordefinition

Mehr

Betriebssysteme. Vorlesung im Herbstsemester 2010 Universität Mannheim. Kapitel 6: Speicherbasierte Prozessinteraktion

Betriebssysteme. Vorlesung im Herbstsemester 2010 Universität Mannheim. Kapitel 6: Speicherbasierte Prozessinteraktion Betriebssysteme Vorlesung im Herbstsemester 2010 Universität Mannheim Kapitel 6: Speicherbasierte Prozessinteraktion Felix C. Freiling Lehrstuhl für Praktische Informatik 1 Universität Mannheim Vorlesung

Mehr

Nebenläufige Programmierung I

Nebenläufige Programmierung I Nebenläufige Programmierung I Martin Wirsing in Zusammenarbeit mit Matthias Hölzl, Piotr Kosiuczenko, Dirk Pattinson 07/03 Ziele 2 Grundlegende Begriffe der nebenläufigen Programmierung verstehen lernen

Mehr

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe

Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um. Dynamische Anpassung der Größe Maximale Größe?! Problem: Was ist, wenn der Stapel voll ist? Idee: Erzeuge dynamisch ein grösseres Array und kopiere um Dynamische Anpassung der Größe Praktische Informatik I, HWS 2009, Kapitel 10 Seite

Mehr

Threading. Arthur Zaczek. Aug 2015

Threading. Arthur Zaczek. Aug 2015 Arthur Zaczek Aug 2015 1 Threading 1.1 Motivation Threading erlaubt die gleichzeitige Ausführung von mehreren Programmteilen. mehrere gleichzeitige Anfragen: Webserver, Datenbank (zu) lange laufende Berechnungen:

Mehr

Vorlesung Informatik II

Vorlesung Informatik II Vorlesung Informatik II Universität Augsburg Wintersemester 2011/2012 Prof. Dr. Bernhard Bauer Folien von: Prof. Dr. Robert Lorenz Lehrprofessur für Informatik 16. Java: Threads für Animationen 1 Motivation

Mehr

1 Klassen anlegen und Objekte erzeugen

1 Klassen anlegen und Objekte erzeugen Werkzeugkiste Java 1 1 Klassen anlegen und Objekte erzeugen Klassengrundgerüst 1 /** 2 * Write a description of class Testklasse here. 3 * 4 * @author ( your name ) 5 * @version (a version number or a

Mehr

Klausur Software-Entwicklung März 01

Klausur Software-Entwicklung März 01 Aufgabe 1: minimaler Punktabstand ( 2+5 Punkte ) Matrikelnr : In einem Array punkte sind Koordinaten von Punkten gespeichert. Ergänzen Sie in der Klasse Punkt eine Klassen-Methode (=static Funktion) punktabstand,

Mehr

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter

Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Kapitel 1 Der vierte Tag 1.1 Vererbung Neben der Verwendung von Klassen ist Vererbung ein wichtiges Merkmal objektorientierter Sprachen. Unter Vererbung versteht man die Möglichkeit, Eigenschaften vorhandener

Mehr

Objektorientierte Programmierung Studiengang Medieninformatik

Objektorientierte Programmierung Studiengang Medieninformatik Objektorientierte Programmierung Studiengang Medieninformatik Hans-Werner Lang Hochschule Flensburg Vorlesung 5 12.04.2017 Was bisher geschah... Objektorientierte Programmierung Klassen und Objekte, Attribute

Mehr

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei

Durch die Teil-von-Beziehung soll ausgedrückt werden, dass ein Objekt A als (physikalischer) Teil eines Objekts B angesehen wird. Insbesondere kann ei Lösungsvorschläge zur Klausur zum Kurs 1618 Sommersemester 2001 am 22.9.2001 Aufgabe 1 a) Benutzungsbeziehung: class Kennzeichen class Fahrzeug boolean gueltigeskennzeichen (Kennzeichen kz) Objekte der

Mehr

8.6 Visualisierung der Sortieralgorithmen

8.6 Visualisierung der Sortieralgorithmen 8.6 Visualisierung der Sortieralgorithmen 8.6.1 Problemstellung Schauen Sie sich den folgenden Quelltext eines Java-Applets an: import java.awt.*; import javax.swing.*; import java.awt.event.*; public

Mehr

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

Nebenläufigkeit in Java. Prof. Dr. Margarita Esponda Nebenläufigkeit in Java Prof. Dr. Margarita Esponda Gliederung der Vorlesung - Konzepte der Nebenläufigkeit -Threads in Java - Synchronisationsprobleme - Klassische Lösungen -Semaphoren - Monitore - Lebenszyklus

Mehr

Softwaresysteme I Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2007 U9.fm

Softwaresysteme I Übungen Jürgen Kleinöder Universität Erlangen-Nürnberg Informatik 4, 2007 U9.fm U9 9. Übung U9 9. Übung U9-1 Überblick Besprechung Aufgabe 6 (printdir) Posix-Threads U9.1 U9-2 Motivation von Threads U9-2 Motivation von Threads UNIX-Prozesskonzept: eine Ausführungsumgebung (virtueller

Mehr

Klausur Software-Entwicklung September 00

Klausur Software-Entwicklung September 00 Aufgabe 1: Wahrheitstafeln ausgeben (ca. 8 Punkte) Matrikelnr : Ergänzen Sie in folgendem Programm, eine rekursive Funktion, die eine Boole'sche Wahrheitstafel für N Variablen ausgibt. Die Zahl N soll

Mehr

Programmieren II. Timer. Vorlesung 11. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Sommersemester 2011. Timer. Sockets.

Programmieren II. Timer. Vorlesung 11. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Sommersemester 2011. Timer. Sockets. Programmieren II Martin Schultheiß Hochschule Darmstadt Sommersemester 2011 1 / 26 Timer Sockets SMTP-Client 2 / 26 Timer Mit einem Timer können bestimmte Aktionen periodisch wiederkehrend durchgeführt

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1 Kapitel 11 Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 2 Ziele Implementierungen für

Mehr

Programmierkurs Java

Programmierkurs Java Programmierkurs Java Java Generics und Java API (1/2) Prof. Dr. Stefan Fischer Institut für Telematik, Universität zu Lübeck https://www.itm.uni-luebeck.de/people/fischer Datenstrukturen In vielen Sprachen

Mehr

1 Klassen anlegen und Objekte erzeugen

1 Klassen anlegen und Objekte erzeugen Werkzeugkiste Java 1 1 Klassen anlegen und Objekte erzeugen Klassengrundgerüst 1 /** 2 * Write a description of class Testklasse here. 3 * 4 * @author ( your name ) 5 * @version (a version number or a

Mehr

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 16/17. Kapitel 13. Listen. Listen 1 Kapitel 13 Listen Listen 1 Ziele Implementierungen für Listen kennenlernen Einfach verkettete und doppelt verkettete Listen verstehen Listen-Implementierungen in der Java-Bibliothek kennenlernen Durch

Mehr

Einführung in die Programmierung

Einführung in die Programmierung Technische Universität München WS 2003/2004 Institut für Informatik Prof. Dr. Christoph Zenger Semestralklausur Einführung in die Programmierung Semestralklausur Java (Lösungsvorschlag) 1 Die Klasse ArrayList

Mehr

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Referenzen. Referenzen 5 Objektorientierte Programmierung in Java Prof. Dr. Ing. André Stuhlsatz Referenzen Beispiel an der einfachen Klasse Walze: public class Walze { int id; public Walze(int id) { this.id = id; Verwenden

Mehr

U08 Entwurfsmuster (II)

U08 Entwurfsmuster (II) U08 Entwurfsmuster (II) Inhalt der Übung Diskussion und Implementierung von Entwurfsmustern Übungsaufgaben Aufgabe 1 (Queue) Gegeben ist das folgende Analysemodell einer Warteschlange (Queue): Eine Warteschlange

Mehr

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

Java Schulung (Java 2 Java Development Kit 5 / 6) 4. Threads und nebenläufige Programmierung 4.1 Prozesse und Threads Moderne Betriebssysteme geben Benutzer die Illusion, verschiedene Programm würden gleichzeitig ausgeführt (Multitasking) Tatsächlich

Mehr

Verteilte Systeme - Java Networking (Sockets) 2 -

Verteilte Systeme - Java Networking (Sockets) 2 - Verteilte Systeme - Java Networking (Sockets) 2 - Prof. Dr. Michael Cebulla 06. November 2014 Fachhochschule Schmalkalden Wintersemester 2014/15 1 / 30 Michael Cebulla Verteilte Systeme Gliederung Wiederholung:

Mehr

Fragen zur OOP in Java

Fragen zur OOP in Java - 1 - Inhalt Was bedeutet OOP?... 2 Was versteht man unter einer Klasse?... 2 Wie nennt man die Mitglieder einer Klasse?... 2 Wie erzeugt man Objekte?... 2 Wie greife ich auf Member einer Klasse zu?...

Mehr

Allgemeine Informatik II SS :30-13:30 Uhr

Allgemeine Informatik II SS :30-13:30 Uhr TU Darmstadt FB Informatik Prof. J. Fürnkranz Vordiplomsklausur - Lösungsvorschlag Allgemeine Informatik II SS 2005 15.09.2005 11:30-13:30 Uhr Hinweise: Als Hilfsmittel ist nur ein schwarzer oder blauer

Mehr

ALP II Dynamische Datenmengen Datenabstraktion

ALP II Dynamische Datenmengen Datenabstraktion ALP II Dynamische Datenmengen Datenabstraktion O1 O2 O3 O4 SS 2012 Prof Dr Margarita Esponda M Esponda-Argüero 1 Dynamische Datenmengen Dynamische Datenmengen können durch verschiedene Datenstrukturen

Mehr

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

Versuchsziele Konzepte der parallelen Programmierung am Beispiel von Threads anwenden können. Einbau von Kontrollmechanismen mittels Semaphore. Hochschule Harz Versuch: fcopy Mit Java FB Automatisierung und Informatik Betriebssysteme Thema: Kopieren einer Datei unter der Kontrolle von Semaphoren Versuchsziele Konzepte der parallelen Programmierung

Mehr

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen

Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen. Operatoren für elementare Datentypen Bedingte Anweisungen Schleifen Programmieren I Martin Schultheiß Hochschule Darmstadt Wintersemester 2011/2012 1 / 25 Operatoren für elementare Datentypen Bedingte Schleifen 2 / 25 Zuweisungsoperator Die Zuweisung von Werten an Variablen

Mehr

Nebenläufige und verteilte Programme CS2301

Nebenläufige und verteilte Programme CS2301 Nebenläufige und verteilte Programme CS2301 Th. Letschert TH Mittelhessen Gießen University of Applied Sciences Netze mit aktiven und reaktiven Knoten Produzent Konsument: aktiv / passiv / reaktiv

Mehr

Sequentielle Programm- / Funktionsausführung innerhalb eines Prozesses ( thread = Ausführungsfaden )

Sequentielle Programm- / Funktionsausführung innerhalb eines Prozesses ( thread = Ausführungsfaden ) Threads Sequentielle Programm- / Funktionsausführung innerhalb eines Prozesses ( thread = Ausführungsfaden ) Ein thread bearbeitet eine sequentielle Teilaufgabe innerhalb eines Prozesses Mehrere nebenläufige

Mehr

Einführung in die Informatik 1

Einführung in die Informatik 1 Einführung in die Informatik 1 Prof. Dr. Harald Räcke, R. Palenta, A. Reuss, S. Schulze Frielinghaus 21.02.2017 Klausur Vorname Nachname Matrikelnummer Unterschrift Füllen Sie die oben angegebenen Felder

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java Vorlesung vom 6.11.07, Weitere Anweisungen Übersicht 1 Verbundanweisung 2 Bedingte Anweisung 3 Auswahlanweisung 4 for Schleife 5 while Schleife 6 do Schleife 7 break Anweisung 8 continue Anweisung 9 Leere

Mehr

Programmiermethodik 3. Klausur Lösung

Programmiermethodik 3. Klausur Lösung Programmiermethodik 3. Klausur Lösung 9. 1. 2014 Name Matrikelnummer Aufgabe mögliche Punkte erreichte Punkte 1 20 2 16 3 45 4 19 5 20 Gesamt 120 1 Seite 2 von 10 Aufgabe 1) Objekt-Orientierung und Vererbung

Mehr

Das Monitorkonzept Brinch-Hansen

Das Monitorkonzept Brinch-Hansen Das Monitorkonzept (nach Hoare/Brinch Brinch-Hansen 1974) Nur ein Prozess bzw. Thread kann zu einem bestimmten Zeitpunkt im Monitor aktiv sein => gegenseitiger Ausschluss, mutual exclusion. Geschützte

Mehr

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung Javakurs FSS 2012 Lehrstuhl Stuckenschmidt Tag 3 - Objektorientierung Warum Objektorientierung Daten und Funktionen möglichst eng koppeln und nach außen kapseln Komplexität der Software besser modellieren

Mehr

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50

Organisatorisches. drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50 Organisatorisches Vorlesung Donnerstag 8:35 bis 10:05 Übung drei Gruppen Gruppe 1: 10:10-11:40, Gruppe 2: 11:45-13:15 Gruppe 3: 13:20-14:50 Tutorium (Mehr oder weniger) abwechselnd Mo und Mi 10-11:30 Termine

Mehr

Organisatorisches. Neue Übungsblätter: Nur mehr elektronisch? Abgabe Di, , 14 Uhr bis Do, , 8Uhr

Organisatorisches. Neue Übungsblätter: Nur mehr elektronisch? Abgabe Di, , 14 Uhr bis Do, , 8Uhr Organisatorisches Neue Übungsblätter: Nur mehr elektronisch? Abgabe Di, 14.10., 14 Uhr bis Do, 23.10., 8Uhr. 14.10.2014 IT I - VO 1 1 IT I: Heute Wiederholung CuP ctd: this Arrays, ArrayLists Schleifen:

Mehr

Schritt 1 - Ein Spielfeld

Schritt 1 - Ein Spielfeld Schritt 1 - Ein Spielfeld Wir beginnen mit zwei einfachen Java-Klassen, dem eigentlichen Spielfeld und dem Applet zum Anzeigen des Spielfeldes (und später der Buttons und der anderen Bedienelemente). Hier

Mehr

Einstieg in die Informatik mit Java

Einstieg in die Informatik mit Java 1 / 47 Einstieg in die Informatik mit Java Anweisungen Gerd Bohlender Institut für Angewandte und Numerische Mathematik Gliederung 2 / 47 1 Ausdrucksanweisung 2 Einfache Ausgabeanweisung 3 Einfache Eingabeanweisung,

Mehr

Betriebssysteme. Wintersemester 2015. Kapitel 2 Prozess und Threads. Patrick Kendzo ppkendzo@gmail.com

Betriebssysteme. Wintersemester 2015. Kapitel 2 Prozess und Threads. Patrick Kendzo ppkendzo@gmail.com Betriebssysteme Wintersemester 2015 Kapitel 2 Prozess und Threads Patrick Kendzo ppkendzo@gmail.com Programm Inhalt Einleitung Prozesse und Threads Speicherverwaltung Eingabe und Ausgabe Dateisysteme Zusammenfassung

Mehr

Programmieren 2 16 Java Collections und Generizität

Programmieren 2 16 Java Collections und Generizität Programmieren 2 16 Java Collections und Generizität Bachelor Medieninformatik Wintersemester 2015 Dipl.-Inform. Ilse Schmiedecke schmiedecke@beuth-hochschule.de 1 Faulheit professionell: Fertige Datenbehälter

Mehr

Informatik B - Objektorientierte Programmierung in Java. Vorlesung 21: Threads 2. Inhalt

Informatik B - Objektorientierte Programmierung in Java. Vorlesung 21: Threads 2. Inhalt Universität Osnabrück 1 wait und notify 3 - Objektorientierte Programmierung in Java Vorlesung 21: Threads 2 SS 2006 Prof. Dr. F.M. Thiesing, FH Osnabrück Neben dem Monitorkonzept stehen mit den Methoden

Mehr

Java-Programmierung. Remote Method Invocation - RMI

Java-Programmierung. Remote Method Invocation - RMI Java-Programmierung Remote Method Invocation - RMI Entwicklungsmethoden Sockets Entwurf verteilter Anwendungen ist relativ aufwändig, da zunächst ein Kommunikationsprotokoll entwickelt werden muss aufwändig

Mehr

U9-3 Vergleich von Thread-Konzepten. U9-2 Motivation von Threads. U9-3 Vergleich von Thread-Konzepten (2) U9-1 Überblick

U9-3 Vergleich von Thread-Konzepten. U9-2 Motivation von Threads. U9-3 Vergleich von Thread-Konzepten (2) U9-1 Überblick U9 9. Übung U9 9. Übung U9-1 Überblick Besprechung Aufgabe 6 (printdir) Posix-Threads U9.1 User-Level Threads: Federgewichtige Prozesse Realisierung von Threads auf Anwendungsebene innerhalb eines Prozesses

Mehr