Hallo zusammen
In dieser Übung sprechen wir über Java und einige Klassen und Konzepte, die euch im Laufe des Semesters das Leben hoffentlich vereinfachen werden
Zuerst geht es um das Interface Collections, anschließend über die allgemeine Verwendung von Threads in Java,
die Synchronisation kritischer Abschnitte sowie die Koordination zwischen Threads
Eine wichtige Rolle beim Programmieren spielt die Verwaltung von Daten
hier bietet sich in Java als Einstieg das Interface Collections an
es gibt in der Standardbibliothek schon zahlreiche Implementierungen für die verschiedensten Anwendungsfälle
einige nützliche Datenstrukturen sind z.B. Sets, die automatisch Duplikate filtern, sowie Listen oder Warteschlangen
Macht euch am besten mit den gängigsten Konzepten vertraut
eine sinnvoll gewählte Datenstruktur kann nicht nur einen großen Performancevorteil bringen
sondern euren Code auch einfacher zu verstehen oder sogar zu schreiben machen
Collections bieten zudem den Vorteil, dass sie gewisse Algorithmen bereits nativ anbieten
so ist es z.B. ohne zusätzlichen Implementierungsaufwand möglich, Collections zu sortieren, das Minimum oder Maximum zu finden
oder auch eine zufällige Reihenfolge der Elemente zu generieren
Unser Beispiel hier zeigt, wie zuerst aus dem Integer-Array eine Collection in Form einer Liste erzeugt wird, mit der addAll-Methode
und diese danach ge"shuffle"t wird, also die Elemente in eine beliebige Reihenfolge gebracht werden
im Bereich Cloud-Computing kann so etwas nützlich sein, wenn man eine möglichst gleichmäßige Lastverteilung zwischen Servern generieren will
so kann man beispielsweise die Reihenfolge, mit der Server angefragt werden, mittels shuffle für jeden Client zufällig generieren
Wenn ihr mit Schlüssel-Wert-Paaren arbeitet, bietet sich dafür eine Map an
eine Map speichert sich zu einem Schlüssel genau ein Wert, filtert also ebenfalls automatisch Duplikate
natürlich kann dieser Wert selbst auch aus einer Datenstruktur bestehen
eine Map, die einen String als Schlüssel und eine Liste selbst als Wert verwaltet, ist natürlich möglich
Zudem bieten Maps normalerweise sehr gute Zugriffszeiten für die Werte an, bis zu O(1)
sind also besonders praktisch wenn man häufig auf unterschiedliche Wert in der Map zugreifen möchte
Der interne Aufbau hängt dabei von der Implementierung selbst ab und bestimmt einige Eigenschaften der Map
so hat z.B. eine HashMap leicht günstigere Zugriffszeiten, eine TreeMap sortiert dafür die Keys automatisch und bietet daher eine deterministische Iteration über alle Paare an
hier lohnt es sich, kurz in die Java API zu schauen um die jeweiligen Vor- und Nachteile der einzelnen Implementierungen zu kennen
Wie ihr im Beispiel sehen könnt, ist die Bedienung von Maps ebenfalls denkbar einfach
Wenn man ein mehrfädiges Programm in Java schreibt, kommt man früher oder später an Threads nicht vorbei
Hier gibt es verschiedene Möglichkeiten Threads zu erstellen, jede mit ihren eigenen Vor- und Nachteilen
ich stelle euch jetzt einige davon vor
Die erste Möglichkeit ist, die eigene Klasse direkt als Unterklasse von java.lang.Thread zu erstellen
die run-Methode bestimmt dabei das Verhalten des Threads und muss deswegen überschrieben werden
bei der Verwendung kann man ganz einfach eine Instanz der eigenen Thread-Klasse erzeugen und diese mittels der start-Methode starten
Eine weitere Möglichkeit ist es, anstatt von Thread zu erben, die eigene Klasse das Interface Runnable implementieren zu lassen
das hat einen großen Vorteil: Java erlaubt pro Klasse nur eine Oberklasse, aber beliebig viele interfaces
wenn eure Klasse also bereits von einer anderen Klasse erbt und ihr dann nicht mehr von Thread selbst erben könnt, ist Runnable eure Lösung
Die Verwendung ist aber fast die gleiche: Die run-Methode muss wieder überschrieben werden
anstatt die Instanz eurer Klasse direkt zu starten müsst ihr aber, wie unten im Beispiel dargestellt
ein zusätzliches Thread-Objekt erstellen, dass eure Instanz dann als Parameter übergeben bekommt
Beide Möglichkeiten, sowohl die Implementierung als Thread oder als Runnable, haben den Vorteil dass eure Thread-Implementierungen die gesamte Mächtigkeit einer eigenen Klasse besitzen
also z.B. globale Variablen, Hilfsmethoden und weiteres nutzen können
für kleineres Thread, die nur Funktionalität ohne Zustand anbieten, ist eine ganze Klasse aber gegebenenfalls unnötiger Overhead
seit Java 8 gibt es daher die Möglichkeit, mittles Lambdas die Funktionalität eines Interfaces direkt zu bestimmen
im Fall von Threads bedeutet das, dass man die run-Methode des Runnable-Interfaces direkt als Lambda-Ausdruck definieren kann
Hierbei ist zu beachten, dass Lambdas in Java eine sehr eigene Syntax haben, die man strikt befolgen muss
die Compilerfehler bei einem fehlerhaften Lambda-Ausdruck sind leider nicht sonderlich hilfreich, passt hier also etwas auf
Der große Vorteil der Erstellung eines Threads mittels Lambda ist, dass man keine eigene Klasse erzeugen muss
außerdem kann man, wie auch ein Beispiel gezeigt, auf den Zustand, also Methoden und Variablen, der Außenklasse zugreifen
Lambdas kommen aus der Welt der funktionalen Programmiersprachen, daher kann euer Lambda-Ausdruck selbst keinen Zustand haben
Presenters
Zugänglich über
Offener Zugang
Dauer
00:14:49 Min
Aufnahmedatum
2020-10-15
Hochgeladen am
2021-04-08 19:17:11
Sprache
de-DE
Nützliche Tipps zu Java
Hinweis: Video aus der Veranstaltung Middleware im Wintersemester 2020/21