Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

1 VE 11 Kruskal-Realisierung Listen. 2 Auf dem Weg zur Kruskal-Realisierung Vorüberlegungen: Der Graph könnte dargestellt werden als Menge von Knoten,

Ähnliche Präsentationen


Präsentation zum Thema: "1 VE 11 Kruskal-Realisierung Listen. 2 Auf dem Weg zur Kruskal-Realisierung Vorüberlegungen: Der Graph könnte dargestellt werden als Menge von Knoten,"—  Präsentation transkript:

1 1 VE 11 Kruskal-Realisierung Listen

2 2 Auf dem Weg zur Kruskal-Realisierung Vorüberlegungen: Der Graph könnte dargestellt werden als Menge von Knoten, jeder Knoten kennt seine Nachbarn. Der Spannbaum könnte dargestellt werden als Menge von Kanten. Die Partition könnte als Menge von Knotenmengen dargestellt werden. Gerade die Darstellung von Knotenmengen wird eine zentrale Rolle spielen.

3 3 Auf dem Weg zur Kruskal-Realisierung Vorüberlegungen: Deshalb: Welche Operationen auf Mengen werden gebraucht: Initialisieren einer Menge als leere Menge Prüfen, ob ein Element in einer Menge enthalten ist Einfügen eines Elements in eine Menge Entfernen eines Elements aus einer Menge Iteration über die Elemente einer Menge Finden eines Elements einer Partition (also einer Menge), das selbst ein Element der Grundmenge enthält

4 4 class ObjElement

5 5 class ObjectListe

6 6 class Kante

7 7 class KantenListe

8 8 VE 11 Threads

9 9 Bislang wurde ein Programmteil in unseren Beispielen nur einmal ausgeführt, nicht mehrmals parallel. Parallele Ausführung ist aber sinnvoll. Z.B. immer dann, wenn Ressourcen (auf Anwendungsebene!) geteilt werden sollen, z.B.: Objekte und Attribute Zugriff auf Datenbanken Paralleler Zugriff auf geteilte Ressourcen funktioniert über so genannte Threads („Fäden“). Threads sind Teile eines Programms, die innerhalb des Programms parallel ausgeführt werden.

10 10 Threads Der Zusammenhang zwischen den Threads ergibt sich dabei in der Regel gerade durch das Teilen der Ressourcen. Threads können auf einer Maschine mit nur einem Prozessor ablaufen und sich dabei aufführen, als ob sie eigene Prozesse wären. Ein Thread wird deshlab auch Ausführungskontext oder leichtgewichtiger Prozess genannt. Ihr Unterschied zu wirklich eigenständigen Prozessen ist, dass sie aus einem Hauptprogramm erzeugt werden. Ein Thread modelliert Objekte, die innerhalb eines umgebenden Prozesses einen eigenen Kontrollfluss haben.

11 11 Multithreading Multithreading bedeutet: Programmpfad wird in unterschiedliche Richtungen verzweigt, diese laufen parallel. Multithreading bedeutet nun, dass es möglich ist, mehrere Thread parallel laufen zu lassen (bei nur einem Prozessor ist dies natürlich keine echte Parallelität).

12 12 Threads Bisher: Single-Threaded Execution Neu: Multi-Threading Methode aMethode b Methode c t Methode aMethode b t Methode c

13 13 Multithreading Probleme: Konkurrierende Threads benutzen gleiche Ressourcen und Daten => Bei Zugriff auf gemeinsam genutzte Ressourcen muss Schutz greifen (nur ein Thread hat den Monitor, der die Ressource kontrolliert) Threads, die mehrere Ressourcen gleichzeitig benötigen, können sich gegenseitig blockieren (Deadlock), indem sie jeweils eine Ressource festhalten und auf die anderen warten. Nicht jede Virtual Machine verteilt CPU-Zeit automatisch gerecht (Es gibt Timeslicing-fähige und -unfähige Systeme) => Laufende Threads sollten auch anderen eine Chance geben Mögliche Zustände oft schwer verständlich, da Parallelität nicht gerade intuitiv verständlich

14 14 Threads In Java: Threads sind Objekte, die Thread erweitern und damit dann auch das Interface Runnable implementieren public class Thread implements Runnable {... public void run(); public void start();... } Threads müssen die Methode run() überschreiben (dort passiert die Arbeit!) Wird von einem Thread-Objekt die (eingebaute) start() -Methode aufgerufen, startet eine Ausführung von run(). Durch mehrfaches Aufrufen von start() können mehrere Ausführungen von run() parallel ausgeführt werden.

15 15 Beispiel class AddThread extends Thread{ public void run(){ for(int i=0;i<10;i++){ MyThreadExample.count++; System.out.print("Add "); System.out.println (MyThreadExample.count); }

16 16 Beispiel class SubtractThread extends Thread{ public void run(){ for(int i=0;i<10;i++){ MyThreadExample.count--; System.out.print("Subtract "); System.out.println( MyThreadExample.count); }

17 17 Beispiel class MyThreadExample{ public static int count=0; public static void main(String args[]){ AddThread a = new AddThread(); SubtractThread b = new subtractThread(); a.start(); b.start(); }

18 18 Beispiel Mögliches Ergebnis Add 1 Add 2 Add 3 Add 4 Add 5 Subtract Add 5 Add Subtract 5 Subtract 4 4...

19 19 Beispiel class AddThread extends Thread{ public void run(){ for(int i=0;i<10;i++){ System.out.print("Add start "); MyThreadExample.count++; System.out.println("Add end:" + MyThreadExample.count); }

20 20 Beispiel class SubtractThread extends Thread{ public void run(){ for(int i=0;i<10;i++){ System.out.print("Sub start"); MyThreadExample.count--; System.out.println("Sub end:" + MyThreadExample.count); }

21 21 Beispiel class MyThreadExample{ public static int count=0; public static void main(String args[]){ AddThread a = new AddThread(); SubtractThread b = new subtractThread(); a.start(); b.start(); }

22 22 Beispiel Mögliches Ergebnis 1: Add start Sub start Sub end:0 Add end:0 Add start Sub start Add end:1 Add start Sub end:0 Add end:1 Sub start Add start Sub end:1 Add end:1 Sub start Add start Sub end:0 Sub start Add end:0 Sub end:0 Sub start Sub end:-1 Add start Sub start Add end:-1 Add start Add end:0 Sub end:0 Add start Add end:1 Add start Add end:2 Sub start Add start Add end:2 Sub end:2 Sub start Sub end:1 Sub start Sub end:0 Mögliches Ergebnis 2: Add start Add end:1 Add start Add end:2 Add start Add end:3 Add start Add end:4 Add start Add end:5 Add start Add end:6 Add start Add end:7 Add start Add end:8 Add start Sub start Sub end:7 Sub start Sub end:6 Sub start Sub end:5 Sub start Sub end:4 Sub start Sub end:3 Sub start Sub end:2 Sub start Sub end:1 Sub start Sub end:0 Sub start Sub end:-1 Sub start Sub end:-2 Add end:-1 Add start Add end:0

23 23 Thread / Runnable Ein Thread wird immer in einer run-Methode gestartet public void run() Diese Methode muss von einer Klasse implementiert werden, dessen Objekt sich mit einem eigenen Thread ablösen möchte Bei Start des Threads wird die run -Methode vom System automatisch aufgerufen (nicht selbst aufrufen!) Ein thread-fähige Klasse kann durch zwei Möglichkeiten definiert werden: Erben von der Klasse Thread, hier muss die run() -Methode der Klasse Thread überschrieben werden Implementieren des Interfaces Runnable, hier muss die run() - Methode des Interfaces implementiert werden

24 24 Using the Runnable Interface class AddThread extends SomeClass implements Runnable{ public void run(){ for(int i=0;i<10;i++) SyncThread.incCount(); }... // Where the thread shall be started // a new Thread Object is created AddThread a = new AddThread(); Thread this_is_the_Thread = new Thread(a); this_is_the_Thread.start();...

25 25 Warum zwei Möglichkeiten? Die einfachere Möglichkeit ist es, von Thread abzuleiten Aber: Java kennt keine Mehrfachvererbung von Klassen, jedoch Mehrfachvererbung von Interfaces Es ist wünschenswert, auch Unterklassen multithreading-fähig zu machen => Hier bleibt nur die Möglichkeit, Runnable zu implementieren

26 26 Methoden von Thread Konstruktoren: public Thread() Muss von abgeleiteter Klasse durch super() aufgerufen werden public Thread(String name) Muss von abgeleiteter Klasse durch super(name) aufgerufen werden Dem Thread wird hier ein Name gegeben public Thread(Runnable target) Muss direkt aufgerufen werden, um Threads über das Runnable -Interface zu definieren Methoden: public synchronized void start() Startet den Thread. Die virtuelle Maschine startet die run() - Methode in eigenem Programmpfad synchronized ist neues Schlüsselwort, später mehr

27 27 Methoden von Thread Methoden: public static Thread currentThread() Klassenmethode, um den aktuell laufenden Thread zu ermitteln public static void yield() Aufforderung, eventuell andere wartende Threads zum Zuge kommen zu lassen public static void sleep(long millis) throws InterruptedException Thread wartet angegebene Zeit. Andere Threads kommen zum Zuge, sofern sie nicht durch belegte Resourcen blockiert sind public final void setPriority(int newPriority) Legt die Priorität des Threads fest. Threads höherer Priorität laufen bevorzugt public final String getName() Gibt den Namen des Threads zurück

28 28 Deaktivierung eines Threads Methoden: sleep siehe oben suspend Unterbricht die Arbeit eines Prozesses wait veranlasst, dass ein Prozess eine vorgegebene Zeit wartet von Object ererbt

29 29 Aktivierung eines passiven Threads Methoden: resume Gegenstück zu suspend notify, notifyAll reaktiviert wartende Prozesse (Gegenstück zu wait) von Object ererbt

30 30 Vernichten eines Prozesses Methoden: stop anomale und sofortige Beendigung eines aktiven oder gerade erzeugten Prozesses (mit Aufräumarbeiten) destroy wie stop aber ohne Aufräumarbeiten

31 31 Ein neuer Thread (Zustand new), der noch nicht ausgeführt wurde, erfordert vor der ersten Ausführung erst mal die Zuweisung von Ressourcen (Speicher). Dann wird er mittels der Methode start() in den Zustand runnable überführt. Runnable bedeutet, dass der Prozess durchgeführt werden kann (also aktiv werden kann). Allerdings kann nur ein Prozess zu jeder Zeit aktiv sein. Die wartenden, schlafenden, unterbrochenen Prozesse sind im Zustand blocked. Wenn der aktive Prozess in den Zustand blocked übergeht, dann wird ein runnable Prozess aktiviert. Zustandsübergänge von Threads

32 32 Die JVM wählt aus der Menge der runnable Prozesse den durchzuführenden aus. Hier gibt es Unterschiede zwischen den JVMs auf verschiedenen Plattformen !! Ein Prozess verlässt den Zustand blocked, wenn die Schlafperiode zu Ende geht, er notifiziert wird (notify), die I/O-Operation, auf die er wartet, terminiert, wenn er per resume fortgesetzt wird. Zustandsübergänge von Threads

33 33 Threads gehen in den Zustand dead über, wenn seine run()-Methode beendet wird, seine stop()- oder destroy-Methode aufgerufen wird. Ein dead Thread kann nicht reaktiviert werden. Zustandsübergänge von Threads

34 34 Prioritäten Jeder Thread hat eine Priorität. Die JVM bevorzugt die Threads mit hohen Prioritäten, wenn ein Thread von runnable in aktiv überführt werden soll. Ein Thread läuft solange bis: er die yield()-Methode aufruft, er nicht mehr runnable ist (z.B. weil er auf einen initiierten I/O warten muss), ein Thread mit höherer Priorität runnable wird.

35 35 Zustandsübergänge von Threads


Herunterladen ppt "1 VE 11 Kruskal-Realisierung Listen. 2 Auf dem Weg zur Kruskal-Realisierung Vorüberlegungen: Der Graph könnte dargestellt werden als Menge von Knoten,"

Ähnliche Präsentationen


Google-Anzeigen