Threads Kritische Bereiche Reales Beispiel Deadlocks Wait/Notify. Programmieren II. Martin Schultheiß. Hochschule Darmstadt Sommersemester 2011
|
|
- Arwed Amsel
- vor 6 Jahren
- Abrufe
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 Einheit 03: Synchronisation Lorenz Schauer Lehrstuhl für Mobile und Verteilte Systeme Heutige Agenda Synchronisation von Threads Locks Java Monitor-Konzept Lock Freigabe Zusammenspiel
MehrAusnahmebehandlung 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
MehrNebenlä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
MehrLinux 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
MehrBeispiel 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
MehrAlgorithmen 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
MehrPraktikum 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
MehrPolymorphie/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
MehrDr. 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
MehrEinfache 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 Aufgabe 1 a) Was versteht man unter einem kritischen Abschnitt oder kritischen Gebiet (critical area)? b) Welche Aufgabe hat ein Semaphor? c)
MehrThread-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
MehrProzesse. 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
MehrZur 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
MehrParallele 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 Friedrich-Alexander-Universität Erlangen-Nürnberg Lehrstuhl Informatik 4 (Verteilte Systeme und Betriebssysteme) www4.informatik.uni-erlangen.de Sommersemester 2009
MehrJava 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/
MehrVorlesung 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
MehrMuster 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
MehrAusgewä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,
MehrEinfü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()
MehrParallele 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,
MehrNebenlä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
MehrProgrammieren 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
MehrEinstieg 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
MehrParallele 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
MehrSynchronisation 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
Mehr2.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 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 Collections Übersicht Package: java.util Gemeinsame Schnittstelle: Collection Datenstrukturen
MehrEINFÜ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
MehrThread-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
MehrProgrammierung 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
MehrUniversitä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
MehrVerteilte 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,
MehrJJ 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(
Mehr5. 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
MehrInterface. 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.
MehrJava 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(),
MehrThreads 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
MehrParallele 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:
MehrFAKULTÄ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,
MehrInstitut 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
Mehr12 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,
MehrDezentrale 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
MehrUniversitä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
MehrThreads - 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
MehrProgrammierkurs 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
MehrInstitut 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
MehrJavakurs 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:
Mehr1 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)
MehrVerteilte 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?
MehrExceptions. 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)
MehrMonitore. 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
MehrBetriebssysteme. 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
MehrNebenlä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
MehrProblem: 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
MehrThreading. 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:
MehrVorlesung 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
Mehr1 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
MehrKlausur 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,
MehrNeben 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
MehrObjektorientierte 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
MehrDurch 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
Mehr8.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
MehrNebenlä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
MehrSoftwaresysteme 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
MehrKlausur 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
MehrProgrammieren 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
MehrEinfü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
MehrProgrammierkurs 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
Mehr1 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
MehrEinfü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
MehrEinfü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
MehrFH 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
MehrU08 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
MehrJava 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
MehrVerteilte 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:
MehrFragen 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?...
MehrAllgemeine 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
MehrALP 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
MehrVersuchsziele 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
MehrOperatoren 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
MehrNebenlä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
MehrSequentielle 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
MehrEinfü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
MehrEinstieg 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
MehrProgrammiermethodik 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
MehrDas 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
MehrJavakurs 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
MehrOrganisatorisches. 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
MehrOrganisatorisches. 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:
MehrSchritt 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
MehrEinstieg 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,
MehrBetriebssysteme. 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
MehrProgrammieren 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
MehrInformatik 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
MehrJava-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
MehrU9-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