4 - Java [ID:21312]
50 von 164 angezeigt

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

Teil eines Kapitels:
Organisatorisches & Grundlagen

Zugänglich über

Offener Zugang

Dauer

00:14:49 Min

Aufnahmedatum

2020-10-15

Hochgeladen am

2020-12-04 12:10:46

Sprache

de-DE

Nützliche Tipps zu Java

Einbetten
Wordpress FAU Plugin
iFrame
Teilen