Universität Paderborn - Home Universität Paderborn
Die Universität der Informationsgesellschaft

Grundlagen der Programmierung 2 SS 2005 - Lösung 6

Lösung zu Aufgabe 20

Zu dieser Aufgabe gibt es keine Musterlösung.

Lösung zu Aufgabe 21

a)
Zu dieser Teilaufgabe gibt es keine Musterlösung.
b-d)

Eine mögliche Implementierung der Stack-Klasse, der Prozessklasse StackUser und des Hauptprogramms finde Sie in der Datei StackExample.java.

Lösung zu Aufgabe 22

Die Lösung ist gegeben durch Memory.java. Es wurde eine Thread-Klasse namens TimeCounter zur Zeitmessung hinzugefügt. Dieser Thread wird im Konstruktor des Memory-Frames gestartet. Das TimeCounter merkt sich den Stand der Millisekunden-Uhr des Systems zu Beginn des Memory-Spiels. Ungefähr jede Sekunden wird aus diesem Startwert und dem aktuellen Stand der Uhr die vergangene Zeit berechnet und als Minuten:Sekunden-Wert angezeigt.

Erwähnenswert ist noch, die Verwendung des invokeLater-Mechanismus für die grafische Darstellung der Spielzeit. Da Swing-Komponenten nicht Thread-sicher ausgelegt sind und nur von einem Thread (dem Event-Thread) manipuliert werden dürfen, wird die Aktualisierung der Anzeige dem Event-Thread aufgetragen. Dazu ist der benötigte Java-Code in ein Runnable-Objekt zu kapseln, das mit der Klassenmethode SwingUtilities.invokeLater als zu erledigende Aufgabe an den Event-Thread weitergegeben wird. Dieser führt dann die run-Methode dieses Objekt aus, sobald keine dringenderen Aufgaben (wie Reaktion auf Benutzeraktionen) zu erledigen sind.

public void run() { running = true; startTime = System.currentTimeMillis(); while (running) { SwingUtilities.invokeLater( new Runnable() { public void run () { mem.drawCurrentTimeString(getTimeString()); } } ); try { Thread.sleep(1000); } catch (InterruptedException e) { } } }

Lösung zu Aufgabe 23

Eine mögliche Lösung für diese Aufgabe wäre Prime.java. Für die Berechnung, ob die gegebene Zahl eine Primzahl ist, wird eine innere Thread-Klasse namens PrimeChecker verwendet. Anstatt die volle Berechnung in actionPerformed auszuführen, wird hier jetzt nur noch ein entsprechender Thread erzeugt. Dabei ist zu beachten, dass in diesem Fall bei jedem Druck der Enter-Taste ein weiterer Thread erzeugt wird. Ist ein solches Verhalten unerwünscht, so sollte man dies abfangen, indem man z.B. das Eingabefeld deaktiviert und eine weitere Erzeugung von PrimeChecker-Threads unterbindet.

Generiert mit Camelot | Probleme mit Camelot? | Geändert am: 03.06.2005