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