Programmieren II (WF2)

Aufgabenblatt 11: Nebenläufigkeit mit Threads

Aufgabe 11.1: Textzeilen zählen – nebenläufig

Schreiben Sie ein Java-Programm (Konsole), welches einen Verzeichnisnamen einliest und dann die Anzahl der Zeilen jeder Datei in diesem Verzeichnis ausgibt. Das Verzeichnis sollte nur Textdateien enthalten (z.B. Quelltext).

  1. Implementieren Sie eine Klasse LineCounterNebenläufig, die den Verzeichnisnamen einliest und für jede Datei einen Thread erzeugt.
    • Dieser liest die Datei ein, zählt die Zeilen und gibt Dateiname und Zeilenzahl auf der Konsole aus.
    • Erstellen Sie dazu eine Klasse LineCounterRunnable, die die Schnittstelle Runnable implementiert.
    • Warten Sie mit der Methode join() auf das Ende aller gestarteten Threads.
  2. Implementieren Sie eine Klasse LineCounterSequentiell, die die Dateien sequentiell ohne Nutzung von Threads liest.
  3. Vergleichen Sie die Performance mit Hilfe der Methode System.currentTimeMillis(): Einmal mit wenigen großen Dateien, einmal mit vielen kleinen Dateien.

Hinweise:

  • Nutzen Sie die Klasse LineNumberReader zur Bestimmung der Zeilenzahl.
  • Eine Zeitmessung mit Hilfe von System.currentTimeMillis() kann nach folgendem Schema passieren:
long startZeit = System.currentTimeMillis();

// Codestück, für das die Zeit gemessen werden soll

long dauerInMS = System.currentTimeMillis() - startZeit;

Aufgabe 11.2: Textzeilen zählen – Kommunikation

Die nebenläufige Variante LineCounterApp des Programms soll nun zu LineCounterAppSorted so erweitert werden, dass das Ergebnis erst zu Ende aller Zählvorgänge ausgegeben werden soll. Die Ausgabe erfolgt absteigend sortiert nach Zeilenzahl.

Die Threads sollen dazu Ihr Ergebnis jeweils in eine gemeinsame HashMap<String, Integer> eintragen, welche als gemeinsame Ressource durch geeignete synchronized-Bereiche oder Methoden abgesichert sein soll.

Hinweise:

  • Auf das Ende eines Threads können Sie mit Thread.join() warten.
  • Die Schlüssel einer Map<String, Integer> m erhalten Sie als Array mit String[] keys = (String[])m.keySet().toArray().
  • Ein Array a können Sie mit Hilfe von Arrays.sort(a, comp) sortieren, wobei Sie einen eigenen Comparator<String> comp für den Vergleich der Dateien implementieren müssen1.

Aufgabe 11.3: Stoppuhr in JavaFX

Stoppuhr

Erstellen Sie eine JavaFX-Anwendung für eine Stoppuhr.

Die Stoppuhr soll mit Start gestartet und mit Stop wieder angehalten werden können. Mit Reset können Sie sowohl bei angehaltener wie bei laufender Stoppuhr die Zeit zurücksetzen.

Erstellen Sie einen eigenen Thread der die eigentliche Stoppuhr realisiert. Der Thread sollte jeweils über sichere JavaFX-Methoden innerhalb des UI threads die Anzeige aktualisieren.

Hinweise:

  • Sie können sowohl bei jedem Startvorgang einen neuen Thread starten, bzw. beim Stoppen wieder beenden ODER einen Thread mit wait() warten lassen, bis er durch den Startvorgang aktiviert wird – beide Ansätze sind möglich!
  • Nutzen Sie Platform.runLater() um ein Runnable an den UI thread zu senden.

  1. Siehe Java 7 API Specification und Skript 6.38.