Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Jutta Koch Geändert vor über 9 Jahren
1
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 1 Thread-Konzept in objektorientierten Programmiersprachen
2
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 2 Threads ein Thread ist ein eigenständiges Programmfragment, das parallel zu anderen Teilen eines Programmes ablaufen kann alle Threads eines Programmes teilen sich einen gemeinsamen Adressraum (leichtgewichtiger Prozeß) in einem Multithreading-System verwaltet die Rechnerkern- vergabe (Scheduler) die zur Ausführung anstehenden Threads man unterscheidet zwei Arten der Parallelität: –pseudoparallele Abarbeitung auf Einprozessorsystemen –echte parallele Abarbeitung auf Mehrprozessorsystemen
3
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 3 Threads in Java Threads werden in der virtuellen Maschine durch Objekte der Klasse java.lang.Thread repräsentiert virtuelle Maschine verwendet Thread-Objekte zum Starten, Starten oder Suspendieren von Threads ein Thread beginnt die Ausführung mit dem Aufruf der run()- Methode des Thread-Objektes Deklaration eines Threads Konstruktion einer Unterklasse der Klasse Thread Implementierung des Interfaces Runnable Erzeugen eines Threads Erzeugen eines Objektes einer Unterklasse der Klasse der Thread Erzeugen eines Thread-Objektes unter Angabe eines Objektes einer Klasse, welches das Interface Runnable implementiert
4
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 4 Deklaration und Erzeugen eines Threads class TextThread extends Thread { String text; public TextThread(String text){ this.text = text; } public void run() { for(int i = 0; i< 10; i++) System.out.println(text); }... TextThread java = new TextThread(´´Java´´); java.start(); TextThread expresso = new TextThread(´´Expresso´´); expresso.start();
5
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 5 Deklaration und Erzeugen eines Threads class TextThread implements Runnable { String text; public TextThread(String text){ this.text = text; } public void run() { while( true ) System.out.println(text); }... TextThread java = new TextThread(´´Java´´); Thread thread = new Thread(java); thread.start();
6
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 6 Zustände eines Threads seit JDK 1.2 verworfen resume() suspend() resume() suspend() interrupt() sleep() notify(), interrupt() wait(), join() run() zu Ende stop() start() new Scheduler yield() schlafend suspendiert blockiert erzeugt rechenwillig beendet rechnend
7
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 7 Steuerung eines Threads Starten eines Threads java.start(); Beenden eines Threads java.stop(); Unterbrechen eines Threads java.suspend(); Fortsetzen eines Threads java.resume(); Pausieren eines Programmes try { java.sleep(1000) // 1000 ms } catch ( InterruptedException e) { }
8
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 8 Steuerung eines Threads interrupt() - Wecken von schlafenden bzw. blockierten Threads yield() - der aufrufende Thread gibt freiwillig die CPU ab isAlive() - true, falls der Thread gestartet, aber nicht beendet ist join() - wartet auf das Ende des Threads, für den die Methode aufgerufen wurde setName(String) - ändert den Namen des Threads getName() - gibt den Namen des Threads aus setPriority(int) - ändert die Priorität des Threads Thread.MIN_PRIORITY = 0 Thread.MAX_PRIORITY = 10 (Standard - Thread.NORM_PRIORITY = 5) getPriority() - gibt die Priorität des Threads aus
9
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 9 Problem: Zugriff auf gemeinsame Daten abc prog.c prog.n............ 45674567 Spooler- Katalog Thread A Thread B out = 4 in = 7
10
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 10 Vermeidung von Wettkampfbedingungen Situationen, bei der zwei oder mehrere Threads auf gemeinsame Daten zugreifen und deren Ergebnisse vom Fortschritt eines Threads abhängen, heißen Wettkampfbedingungen Benötigt wird ein Verfahren zur Gewährleistung eines gegen- seitigen Ausschlusses von Threads Programmteil aus dem auf den gemeinsamen Speicher zugegriffen wird heißt kritischer Bereich Vermeidung von Wettkampfbedingungen: 2 Threads dürfen sich nicht gleichzeitig in kritischen Bereichen aufhalten keine Annahme über relative Geschwindigkeit der Threads kein Threads außerhalb eines kritischen Bereiches darf einen anderen blockieren kein Thread sollte beliebig lange auf den Eintritt in einen kritischen Bereich warten
11
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 11 Synchronisationskonzept: Semaphor Mechanismus zum wechselseitigen Ausschluss und zur Synchronisation von Threads (Dijkstra, 1965) Ein Semaphor ist eine gemeinsam benutzte Integer-Variable S auf die nur die drei Operationen Init, P(asseer) und V(erlaat) zugreifen können P(S): if(S > 0) then S = S-1; else { stoppe ausführenden Thread; trage den Thread in die Warteliste von S ein; } V(S): S = S + 1; if(Warteliste von S != ) then { wähle Thread Q aus Warteliste von S; springe zu der P-Operation in Q, durch die Q gestoppt wurde; } System muss atomare Ausführung von P und V garantieren
12
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 12 Anwendung: Semaphor Definition kritischer Abschnitte: Sei S mit 1 initialisiert P(S); { kritischer Abschnitt } V(S); Synchronisation von Threads: Sei S mit 0 initialisiert Thread A Thread B {... {... V(S); P(S); // B wartet auf A...} Initialisierungswert n > 1: Verwaltung kritischer Bereiche, die von n Threads gleichzeitig genutzt werden können
13
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 13 Beispiel: Producer und Consumer Threads abc cde efg 0123401234 Puffer out = 1 in = 4 Consumer Producer
14
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 14 Beispiel: Producer und Consumer Threads Semaphore nichtvoll = 5, // Puffer ist nicht voll, initialisiert mit Puffergröße 5 nichtleer = 0, // Puffer ist nicht leer gesperrt = 1; // Puffer wird gelesen oder beschrieben Producer: do{ Erzeuge Datum; P(nichtvoll); P(gesperrt); Lege Datum im Puffer ab; V(gesperrt); V(nichtleer); } until true; Consumer: do{ P(nichtleer); P(gesperrt); Nimm Datum aus Puffer; V(gesperrt); V(nichtvoll); Verbrauche Datum; } until true;
15
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 15 Probleme bei Semaphoren Falsche oder missbräuchliche Anwendung durch den Programmierer V(S);P(S);... P(S); Auftreten von Verklemmungen (Deadlocks) P(S 1 ); P(S 2 ); P(S 2 ); P(S 1 );... V(S 2 ); V(S 1 ); V(S 1 ); V(S 2 ); Verklemmungen können durch Anforderung aller Semaphore vor Eintritt in den kritischen Bereich vermieden werden
16
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 16 Synchronisationskonzept: Monitor Semaphormechanismen für wechselseitigen Ausschluss und Synchronisation werden in einem Monitor (Hoare, Hansen) gekapselt Monitor ist ein abstrakter Datentyp mit der zusätzlichen Eigenschaft des wechselseitigen Ausschluss Bedingungsvariablen S mit denen über wait(S) und notify(S) zugegriffen werden kann Deklaration gemeinsamer Variablen Deklaration von Operationen Initialisierungscode Eingabeschlange für Threads
17
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 17 Monitore in Java Ein Monitor ist die Kapselung eines kritischen Bereiches mit Hilfe einer automatisch verwalteten Sperre jedes von der JVM angelegte Objekt verfügt über eine Sperre Schlüsselwort synchronized markiert Methoden in einer Klasse für die ein Thread vor Ausführung die Sperre verlangen muß class SpeechSynthesizer{ synchronized void say(String words){ // Speak } Sperre wird immer von einem Objekt angefordert nicht statische Methode => Objekt mit dem die Methode aufgerufen wird statische Methode => Class-Objekt der entsprechenden Klasse
18
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 18 Beispiel class SpreadSheet { int cellA1, cellA2, cellA3; synchronized int sumRow() { return cellA1 + cellA2 + cellA3; } synchronized void setRow(int a1, int a2, int a3){ cellA1 = a1; cellA2 = a2; cellA3 = a3; } Aufruf von sumRow() oder setRow() über ein Objekt a verlangt jeweils die Sperre von Objekt a
19
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 19 Beispiel class SpreadSheet { static int cellA1, cellA2, cellA3; synchronized static int sumRow() { return cellA1 + cellA2 + cellA3; } synchronized static void setRow(int a1, int a2, int a3){ cellA1 = a1; cellA2 = a2; cellA3 = a3; } Aufruf von sumRow() oder setRow() verlangt jeweils die Sperre von dem Class-Objekt der Klasse SpreadSheet
20
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 20 Synchronisation von Blöcken Schlüsselwort synchronized kann für Blöcke verwendet werden Angabe eines Objektes, dessen Sperre verwendet werden soll synchronized (myObject){ // Anweisungsblock der synchronisiert werden muß... } synchronized void myMethod(){ void myMethod(){... synchronized (this){ }... } Synchronisation von Blöcken oder Methoden verschiedener Klassen
21
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 21 Freigabe von Sperren wait() und notify() erweitern Synchronisationsmechanismen Methodenaufruf wait() bewirkt: Thread beendet Bearbeitung eines synchronisierten Blocks und geht in den “schlafenden” Zustand Sperre für den synchronisierten Block wird freigegeben Methodenaufruf notify() bewirkt: mit wait() in den schlafenden Zustand versetzter Thread, kann wieder die Sperre des entsprechenden Objektes anfordern notify() aufrufender Thread beendet normal die Ausführung auf dem synchronisierten Block “aufgeweckter” Thread kann (muß aber nicht) als nächstes die Sperre erhalten und führt dann die Bearbeitung fort überladene Version der wait-Methode und notifyAll()-Methode
22
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 22 Beispiel class MyThing { synchronized void waiterMethod() { // Ausführung irgendwelche Sachen wait(); // Weiterbearbeitung der Methode } synchronized void notifierMethod() { // Ausführung irgendwelcher Sachen notify(); // Weitere Arbeiten werden ausgeführt werden } synchronized void relatedMethod(){ // Ausführung irgendwelcher Arbeiten }
23
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 23 Beispiel: Producer und Consumer Threads class Producer extends Threads{ static final int MAXQUEUE = 5; private Vector messages = new Vector(); public void run(){ try{ while(true){ putMessage(); sleep( 1000); } catch (InterruptedException e){ } }...
24
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 24 Beispiel: Producer und Consumer Threads... private sychronized void putMessage() throws InterruptedException{ while( message.size == MAXQUEUE) wait(); message.addElement( new java.util.Date().toString()); notify(); } public synchronized String getMessage() throws InterruptedException { notify(); while( messages.size() == 0 )wait(); String.message = (String) messages.firstElement(); messages.removeElement( message ); return message; }
25
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 25 Beispiel: Producer und Consumer Threads class Consumer extends Threads { Producer producer; Consumer( Producer p){ producer = p; } public void run() { try { while( true ){ String message = producer.getMessage(); System.out.println(´´Got message: ´´ + message); sleep( 2000 ); } } catch ( InterruptedException e ) { } }
26
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 26 Rechnerkernvergabe Rechnerkernvergabe (Scheduler) entscheidet welcher der lauffähigen Threads den Rechnerkern zugewiesen bekommt Rechnerkernvergabe sollte garantieren, dass jeder Thread einen gerechten Anteil an der CPU erhält die CPU zu 100 Prozent ausgelastet wird die Antwortzeit für interaktive Benutzer minimiert wird die Anzahl der bearbeiteten Aufträge pro Stunde maximiert werden Hauptproblem: Laufzeitverhalten der im System befindlichen Threads kann nicht vorausgesagt werden Rechnerkernvergabestrategien können in verdrängende und nicht verdrängende Strategien (non preemptive und preemptive scheduling) unterteilt werden
27
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 27 Nicht verdrängende Rechnerkernvergabestrategien FIFS-Strategie: Threads erhalten den Prozessor in der Reihenfolge ihres Eintretens in die Liste `rechenwillig´ Prioritätengesteuerte Rechnerkernvergabe: Warteschlangen Priorität 123123 RK Warteschlange ACEB AE B C
28
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 28 Verdrängende Strategien: Round-Robin-Verfahren jedem Thread wird eine Zeitscheibe zugewiesen, innerhalb welcher er laufen darf Umschalten der CPU Zeitscheibe ist abgelaufen Thread terminiert oder wird blockiert Rechnerkernvergabe verwaltet Liste rechenwilliger Threads – Zeitscheibe abgelaufen Einfügen am Ende der Liste Festlegen der Dauer einer Zeitscheibe kleine Zeitscheibe geringe Effizienz der CPU durch viele Kontextumschaltungen große Zeitscheibe schlechte Antwortzeiten für interaktive Anforderungen Zeitscheibe um 100 ms ist häufig ein vernünftiger Kompromiss
29
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 29 Prioritätengesteuertes Round-Robin-Verfahren Priorität hoch tief innerhalb der nach Prioritäten geordneten Warteschlangen wird das Round-Robin-Verfahren angewandt
30
Dr. Wolfram Amme, Das Thread-Konzept in objektorientierten Programmiersprachen, Informatik II, FSU Jena, SS 2002 30 Methoden zur Rechnerkernvergabe in Java Prioritätengesteuerte Rechnerkernvergabe Rechnerkernabgabe sleep(), wait(), yields() und stop()
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.