Java Multithreading, Netzwerke, GUI und OOP – Grundlagen

Gesendet von Anonym und eingeordnet in Informatik

Geschrieben am in Deutsch mit einer Größe von 148,51 KB

Multithreading und Multitasking

Multithreading bedeutet, dass mehrere Prozesse innerhalb desselben Programms gleichzeitig ausgeführt werden.
Multitasking bedeutet, dass sich mehrere Prozesse eine gemeinsame Ressource teilen.
Threading bedeutet, dass innerhalb eines Prozesses einzelne Aufgaben auf einzelne Threads verteilt werden. Threads laufen parallel.
Scheduling ist die Erstellung eines Ablaufplans, der zeitlich begrenzte Ressourcen Prozessen zuweist. Die Entscheidung trifft nur das Betriebssystem.

Vorteile

Vollständige Nutzung der Leistung, asynchrone Prozesse und synchroner Zugriff von mehreren Personen.

Lebenszyklus eines Threads

New > start() > Runnable (wird ausgeführt) > Running > (timed) Waiting > Dead

Priorities

Hilfe für das Betriebssystem, die Reihenfolge zu bestimmen. MIN_PRIORITY (1) bis MAX_PRIORITY (10), Default = NORM_PRIORITY (5).

Erzeugung von Threads

1. Runnable-Interface implementieren:

class MyClass implements Runnable;
public void run() – Methode implementieren.
Thread(Runnable threadObj, String threadName) – Erzeugung des Thread-Objekts.
void start()

2. Ableitung der Klasse Thread:

class MyClass extends Thread;
public void run();
void start();

Synchronisation

Codebereich oder ganze Methode schützen. Sie werden für ein Objekt gesperrt, sobald ein Thread sie betritt; andere Threads warten. So entstehen keine verlorenen Updates.

Wichtige Methoden

  • th1.join() – verhindert die weitere Ausführung, bevor ein Thread „fertig“ ist.
  • final boolean isAlive() – liefert true nach start() und vor dem Zustand Dead.
  • static void yield() – der aktuelle Thread pausiert, um anderen Threads mit gleicher Priorität eine Chance zu geben.
  • static void sleep(long millisec) – pausiert für die angegebene Zeit in Millisekunden.
  • static boolean holdsLock(Object x) – true, wenn der aktuelle Thread den Lock für x hält.
  • static void dumpStack() – gibt den Stacktrace des aktuellen Threads aus (Debugging).

Deadlocks und Thread-Kommunikation

Ein Deadlock ist eine Situation, in der mindestens zwei Threads dauerhaft blockiert sind und aufeinander warten. Sie benötigen dieselbe Sperre, fordern diese jedoch in unterschiedlicher Reihenfolge an.

  • wait() – hebt die Sperre auf und wartet auf eine Benachrichtigung.
  • notify() – sendet eine Benachrichtigung an einen wartenden Thread (weckt einen einzelnen Thread auf).
  • notifyAll() – weckt alle wartenden Threads auf.

Netzwerkkommunikation

P2P: Die Beteiligten sind gleichberechtigt und können Dienste anbieten und konsumieren.
Client/Server: Der Client (z. B. ein Webbrowser) stellt HTTP-Requests an den Server.

Socket ist ein Objekt, das als Kommunikationsendpunkt dient und vom Betriebssystem bereitgestellt wird. Es ermöglicht eine bidirektionale Verbindung, bei der Daten sowohl empfangen als auch gesendet werden können. Die Kommunikation ist möglich zwischen Prozessen auf demselben Rechner oder über das Internet mit einem fremden Rechner.

Server

java.net.ServerSocket sS = new ServerSocket(8888);
Socket s = sS.accept(); – wartet auf einen Client, merkt sich ihn, hört Nachrichten und antwortet.

Client

Socket s = new Socket(ip, port); – die Verbindung wird über den Konstruktor hergestellt.

GUI mit Swing

javax.swing ist eine API (Application Programming Interface) zum Erstellen einer grafischen Benutzeroberfläche und basiert auf AWT (Abstract Window Toolkit).

  • Container enthält eine Gruppe von GUI-Elementen.
  • JFrame – die einfachste, oberste Ebene; wird automatisch sichtbar.
  • JPanel – allgemein verwendbar; muss in einen JFrame eingefügt werden.
  • Layout – absolut, Border (North/South/East/West/Center), Grid (Spalten/Zeilen).

Komponenten: JLabel (Anzeige von Text oder Bild), JPasswordField / JFormattedTextField (einzeilig), JTextArea (mehrzeilig).

AbstractButton – Basisklasse für Swing-Buttons; definiert das Verhalten von Schaltflächen und Menüelementen und bietet Methoden für ActionEvents.
AbstractAction – Basisklasse für Aktionen; definiert die Art der Ausführung von Aktionen.
Listener fängt das Event der Quelle ab und ruft den entsprechenden Event-Handler (Code) auf.
JOptionPane – Dialoge (Confirm, Input, Message).

AAAAAElFTkSuQmCC

Ein- und Ausgabe sowie Dateien

java.io: InputStream/OutputStream – Datenfolge lesen bzw. schreiben. Ein File-Objekt repräsentiert eine Datei oder ein Verzeichnis; der Name muss nicht physisch existieren. Der Verweis erfolgt über absolute oder relative Pfadnamen. Pfadtrenner: \ (Windows, z. B. C:\) bzw. / (Unix, Wurzel /).

java.io.File: getName(), getPath(), exists(), isDirectory(), isFile(), length(), canExecute(), canRead(), canWrite(), delete(), mkdir(), list().

File file = new File("pfad"); erzeugt keine Datei automatisch (dazu file.createNewFile()), sondern nur ein Objekt im Speicher, das diesen Pfad repräsentiert.

Buffer (Lesen/Schreiben): RAM-Zwischenspeicher für große Blöcke. Er minimiert Festplattenzugriffe und ist extrem schnell.

Exceptions

Exceptions sind unerwartete Ereignisse, die den Ablauf stören. Errors sind schwerwiegende Fehler, die nicht behandelt werden können und zum Programmende führen.

Throwing: Erstellen eines Exception-Objekts und Übergabe an das Laufzeitsystem.
throw new IndexOutOfBoundsException("Error message to be shown in console"); – innerhalb einer Methode, um eine Exception manuell auszulösen.
public void readFile(String fileName) throws FileNotFoundException {} – Warnung an den Aufrufer.

Checked Exceptions: müssen behandelt werden (try-catch oder throws), sonst lässt sich das Programm nicht kompilieren. Sie erben von Exception (z. B. IOException).
Unchecked Exceptions: ohne Ankündigung; sie erben von RuntimeException.

Programmierparadigmen und Java

Maschinensprache, Assembler, prozedural (Anweisungsabfolge, Divide and Conquer), nicht-prozedural, objektorientiert (reale Objekte, Wiederverwendbarkeit, große Projekte). Ein Paradigma ist der Grundstil einer Programmierung.

Java ist plattformunabhängig, objektorientiert, robust, portierbar, an C angelehnt und verfügt über eine große Klassenbibliothek.

Klassen und Objekte

Abstraktion: Reale Gegebenheiten werden zu Software-Objekten. Eine Klasse ist der Bauplan, ein Objekt eine konkrete, eindeutige Instanz mit eigenen Kopien der Eigenschaften (Instanzvariablen). new reserviert Speicherplatz im System.

Konstruktor: Schnittstelle zur Objekterzeugung in einem definierten Anfangszustand mit Speicherreservierung. Jede Klasse hat mindestens einen Konstruktor; sein Name entspricht der Klasse, er ist wie eine Methode deklariert, besitzt aber keinen Rückgabewert. Der Default-Konstruktor wird automatisch ohne Parameter erzeugt. this ist die Referenz auf das aktuelle Objekt.

Kapselung: Schutz vor unerwünschtem Zugriff; verbessert Testbarkeit, Stabilität, Änderbarkeit und Übersicht.
Zugriffsmodifikatoren: private (eigene Klasse), default (Package), protected (Package und Kindklassen), public (alle).

Packages organisieren Namensräume, vermeiden Konflikte und unterstützen die Kapselung. Mit import werden externe Werkzeuge eingebunden; diese müssen public sein. java.lang wird automatisch importiert (z. B. String, System).

Methoden definieren Verhalten. Übergibt man einen primitiven Datentyp als Parameter, bleibt das Original unverändert.
Rekursion: direkt – eine Methode ruft sich selbst auf; indirekt – zwei Methoden rufen sich abwechselnd auf.

Vererbung

Eine Kindklasse (Subklasse) erbt alle Variablen und Methoden der Elternklasse.

Arten:

  1. Einfach (1 Elternklasse)
  2. Multilevel (Großeltern > Eltern > Kind)
  3. Hierarchisch (1 Oberklasse > mehrere Kinder)
  4. Multipel (Kind erbt gleichzeitig von mehreren Eltern; in Java bei Klassen verboten, nur über Interfaces möglich)
  5. Hybrid (Mischung)

final bei einer Klasse: nicht vererbbar. final bei einer Methode: kein Override erlaubt.

Polymorphismus

Up-Casting (Kind > Eltern): Tier t = new Loewe();
Down-Casting (Eltern > Kind): if (t instanceof Loewe) { Loewe l = (Loewe) t; }

Method Overloading: Gleicher Methodenname in einer Klasse, unterschieden durch Parameter (Art, Anzahl). Rückgabewert und Parametername spielen keine Rolle.

Interfaces

Eine Klasse darf nur von einer Klasse erben, aber beliebig viele Interfaces implementieren. Interfaces enthalten keinen Code, nur Signaturen und Konstanten. Methoden sind immer public, es gibt keinen Konstruktor. Ein Interface kann andere Interfaces erweitern.

Abstrakte Klassen

Eine abstrakte Klasse ist eine Oberklasse, die nicht instanziiert werden kann. Sie ist eine Mischung aus Superklasse (mit implementierten Methoden) und Interface (mit Signaturen).

Verwandte Einträge: