Ohne Verwendung von Threads können zwei Turtle nicht gleichzeitig zeichnen sondern nur abwechlungsweise. Im folgenden Beispiel zeichnen zwei Turtle abwechslungsweise je eine Treppenstufe |
// WithoutThread.java import ch.aplu.turtle.*; import java.awt.Color; public class WithoutThread { public WithoutThread() { Turtle john = new Turtle(); Turtle laura = new Turtle(john); laura.setColor(Color.red); laura.setPenColor(Color.red); laura.setPos(0, 160); laura.left(90); for (int i = 0; i < 8; i++) { step(john); step(laura); } } private void step(Turtle t) { t.forward(20); t.left(90); t.forward(20); t.right(90); } public static void main(String[] args) { new WithoutThread(); } } |
|
// ThreadEx1.java import ch.aplu.turtle.*; import java.awt.Color; public class ThreadEx1 extends TurtleFrame { public ThreadEx1() { Turtle john = new Turtle(this); Turtle laura = new Turtle(this); laura.setColor(Color.red); laura.setPenColor(Color.red); laura.setPos(0, 160); laura.left(90); draw(john); draw(laura); } private void draw(final Turtle t) { new Thread() { public void run() { for (int i = 0; i < 8; i++) step(t); } }.start(); } private void step(Turtle t) { t.forward(20); t.left(90); t.forward(20); t.right(90); } public static void main(String[] args) { new ThreadEx1(); } } |
Erklärungen zum Programmcode:
new Thread() { public void run() { ... } }.start(); |
Es wird eine Instanz der Klasse Thread erzeugt, welche die Methode run() überschreibt. Beim Start des Threads wird diese Methode ausgeführt. Der Thread wird durch Aufruf der Methode start() gestartet |
private void draw(final Turtle t) | Da die Turtle t im Innern der neuen Klasseninstanz verwendet wird, muss t final (unveränderlich) deklariert sein |
|
In diesem Beispiel wird eine andere Möglichkeit gezeigt, Threads zu verwenden. Man deklariert eine innere Klasse TurtleThread, die von der Klasse Thread abgeleitet ist. In der Klasse TurtleThred wird die Methode run() überschrieben, die das Zeichnen der Figur ausführt. In der Applikationsklasse wird für jede Turtle eine Instanz der Klasse TurtleThread erzeugt und gestartet. Der Thread führt seine Methode run() aus.
|
Erklärungen zum Programmcode:
private class TurtleThread extends Thread |
Der Konstruktor der Klasse TurtleThread kopiert eine Turtle-Referenz in eine Instanzvariable, die in run() verwendet wird |
new TurtleThread(john).start() | Erzeugt eine neue Instanz der Klasse TurtleThread für die Turtle john und startet den Thread |
Im folgenden Beispiel wird an der Stelle des Mausklicks eine neue Turtle erzeugt und diese zeichnet einen Stern. Da jede Turtle im eigenen Thread zeichnet, können gleichzeitig beliebig viele zeichnende Turtles erzeugt werden.
|
Erklärungen zum Programmcode:
Turtle t = new Turtle(joe)
|
Die Turtle joe wird dazu verwendet, dass sich alle mit Mausklick erzeugten Turtles in ihrem Fenster befinden |
t.setScreenPos(e.getPoint()) |
Bei jedem Mausklick wird die neue Turtle t an die Position des Mausklicks gesetzt |
new Thread() { public void run() { for (int i = 0; i < 5; i++) t.fd(40).rt(144); } }.start(); |
Das Zeichnen eines Sterns erfolgt in einem neuen Thread |