35
1 VE 11 Kruskal-Realisierung Listen

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,

Embed Size (px)

Citation preview

Page 1: 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,

1

VE 11

Kruskal-Realisierung

Listen

Page 2: 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,

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.

Page 3: 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,

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

Page 4: 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,

4

class ObjElement

Page 5: 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,

5

class ObjectListe

Page 6: 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,

6

class Kante

Page 7: 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,

7

class KantenListe

Page 8: 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,

8

VE 11

Threads

Page 9: 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,

9

Threads

• 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.

Page 10: 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,

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.

Page 11: 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,

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).

Page 12: 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,

12

Threads

• Bisher: Single-Threaded Execution

• Neu: Multi-Threading

Methode a Methode b

Methode c

t

Methode a Methode b

t

Methode c

Methode c

Page 13: 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,

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

Page 14: 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,

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.

Page 15: 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,

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); } }}

Page 16: 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,

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); } }

}

Page 17: 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,

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();

} }

Page 18: 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,

18

Beispiel

Mögliches Ergebnis

Add 1 Add 2 Add 3 Add 4 Add 5 Subtract Add 5 5 Add Subtract5 Subtract 4 4 ...

Page 19: 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,

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);

} }}

Page 20: 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,

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);} }

}

Page 21: 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,

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();

} }

Page 22: 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,

22

Beispiel

Mögliches Ergebnis 1:Add start Sub start Sub end:0Add end:0Add start Sub start Add end:1Add start Sub end:0Add end:1Sub start Add start Sub end:1Add end:1Sub start Add start Sub end:0Sub start Add end:0Sub end:0Sub start Sub end:-1Add start Sub start Add end:-1Add start Add end:0Sub end:0Add start Add end:1Add start Add end:2Sub start Add start Add end:2Sub end:2Sub start Sub end:1Sub start Sub end:0

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

Page 23: 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,

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

Page 24: 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,

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 createdAddThread a = new AddThread();Thread this_is_the_Thread = new Thread(a);this_is_the_Thread.start();...

Page 25: 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,

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

Page 26: 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,

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

Page 27: 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,

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

Page 28: 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,

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

Page 29: 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,

29

Aktivierung eines passiven Threads

• Methoden:• resume

• Gegenstück zu suspend• notify, notifyAll

• reaktiviert wartende Prozesse (Gegenstück zu wait)• von Object ererbt

Page 30: 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,

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

Page 31: 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,

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

Page 32: 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,

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

Page 33: 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,

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

Page 34: 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,

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.

Page 35: 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,

35

Zustandsübergänge von Threads