Es steht Ihnen wiederum ein Testprogramm zur Verfügung, dass Sie für die Kontrolle Ihrer Arbeit verwenden können. Sie finden hier Hinweise zu folgenden Themen:
Um Ihre Implementation zu testen, teilt das Testprogramm das Fraktal in mehrere gleich grosse Bereiche, die dann von je einem Thread berechnet werden. Wählen Sie z.B. 16 Threads, so wird das Fraktal wie in Bild 1 abgebildet in 16 Einzelbilder aufgeteilt, die unabhängig voneinander berechnet werden.
Das Testprogramm verwendet die start()-Methode des Fraktals um die Berechnung zu starten. Zudem wird auch die stop()-Methode verwendet, um die Threads anzuhalten. Es gibt nur ein Testprogramm für beide Klassen, mit den Schaltknöpfen gleich unterhalb des Bildes, können Sie zwischen den beiden Klassen wählen. Das Testprogramm ist sehr simpel und erklärt sich von selbst. Das Testprogramm heisst FractalViewer und wird wiederum mit dem Interpreter gestartet.
Zur Erinnerung: es genügt die run()-Methode zu überschreiben, diese kann dann z.B. draw() aufrufen. Die Implementation der run()-Methode kann in den Klassen Mandelbrot und Julia erfolgen, oder aber in der Basisklasse Fractal. Sie finden deshalb im Abschnitt Ausgangsbasis auch den Quellcode für diese Klasse.
Die unten aufgeführten Klassen bilden eine Ausgangsbasis für diesen Posten. Wenn Sie keine eigene Lösung für die vorangehenden Posten gefunden haben, können Sie diese Dateien übernehmen. Kopieren Sie sie zuerst in Ihr Arbeitsverzeichnis; danach müssen Sie jeweils die ersten drei Buchstaben (REF) der Dateinamen löschen.
Dieser Abschnitt beschäftigt sich mit der richtigen Plazierung der Teilbilder. Wenn Sie die Felder cx und cy schon im Posten Werkzeuge richtig mitberücksichtigt haben, müssen Sie diesen Abschnitt nicht mehr durchlesen.
Für diesen Posten ist es wichtig, dass Sie cx und cy beim Setzen eines Bildpunktes richtig mitberücksichtigen. Die Methode dot(color, x, y) der Klasse FCanvas zeichnet einen Punkt mit einer bestimmten Farbe an die verlangten Koordinaten. Dabei müssen x und y relativ zu (0,0) angegeben werden. cx und cy geben Ihnen also den Offset an, der zu der zu den lokalen Koordinaten, die jeder Thread führt, hinzu addiert werden muss.
Bild 1: Aufteilung des ursprünglichen Bereiches in 16 Teile
Das Testprogramm lässt jedes Teilbild von einem separaten Thread berechnen. Dabei wird aber nur ein FCanvas-Objekt verwendet um zu zeichnen. Angenommen jeder Thread hätte seine eigene Zeichenfläche, so würden am Ende der Berechnung 16 Bilder bereitstehen, die dann richtig zusammengesetzt werden müssten. Wir hätten nicht ein grosses Bild, sondern 16 kleine Bilder. Wollte man diese Bilder verwalten, so müsste man sich noch merken welche Bilder wie, mit welchen anderen zusammengesetzt werden müssen.
Statt dessen berechnen wir zwar 16 Teilbilder, lassen die Threads aber in die gleiche Zeichenfläche (canvas) zeichnen. Damit jetzt aber nicht alle 16 Threads in das Rechteck ganz unten links zeichnen, muss jedem von ihnen noch ein Offset (cx, cy) mitgegeben werden.
Natürlich ruft das Testprogramm alle 16 Threads mit unterschiedlichen Werten für (cx, cy) und auch für (fx, fy) auf. Durch das Zeichnen in eine gemeinsame Fläche können Probleme auftretet, die wir im Posten Synchronisation behandeln. Ärgern Sie sich also nicht, wenn Ihr Fraktal etwas «verrauscht» ist.
Hier finden Sie den Einstieg in die Originaldokumentationen:
Parallelität - Threads in Java - Tips und Hinweise - Lösungsmöglichkeit
OOP - Werkzeuge - Referenzen - Fäden - Synchronisation - Applets - Dokumentation
Werkstatt - Bibliographie