Drucken

Threads


Die heutigen Betriebssysteme sind so leistungsfähig, dass man mehrere Programme parallel laufen lassen kann (Multitasking). Da meist nur ein Prozessor zur Verfügung steht, wird dies durch eine schnelle Umschaltung zwischen den Prozessen erreicht. Auch Teile eines Android-Programms können auf mehrere Prozesse aufgeteilt werden. Man spricht dabei von Threads.

Ohne Verwendung von Threads können zwei Turtle nicht gleichzeitig zeichnen. Im Beispiel Tu13 zeichnen zwei Turtle abwechslungsweise je eine Treppenstufe ( App Tu13 ohne Threads).

Unter Verwendung von Threads können die beiden Turtle gleichzeitig zeichnen. Dazu deklarieren wir eine aus Turtle abgeleitete Klasse PainterTurtle, welche die Methode run() implementiert. Diese wird in jeder Instanz der PainterTurtle in einem eigenen Thread ausgeführt.

Source mit Online-Compiler bearbeiten

App installieren auf Smartphone oder Tablet

QR-Code

Sources downloaden (Tu21.zip)

// Ex21.java

package app.tu21;

import turtle.*;

public class Tu21 extends Playground
{
  void main()
  {
    Turtle joe = new PainterTurtle(-100-100, RED,  0);
    Turtle lisa = new PainterTurtle(-100, 100, GREEN, 90);
  }

  class PainterTurtle extends Turtle implements Runnable
  {
    PainterTurtle(double x, double y, int c,  double dir)
    {
      super( x, y, c);
      setHeading(dir);
      setPenColor(c);
      new Thread(this).start();
    }

    public void run()
    {
      for (int i = 0; i < 10; i++)
        step();
    }

    private void step()
    {
      fd(20);
      rt(90);
      fd(20);
      lt(90);
    }
  }
}
 

Erklärungen zum Programmcode:

PainterTurtle(double x, double y, int c, double dir)

Dem Konstruktor wird die Startposition, die Farbe und die Startrichtung übergeben

super( x, y, c);

Der Konstruktor von Turtle wird mit der Startposition und Farbe initialisiert

new Thread(this).start();

Ein neuer Thread wird erzeugt und gestartet

Turtle joe = new PainterTurtle(-100, -100, RED, 0); In main() wird eine neue PainterTurtle erzeugt. Diese beginnt "selbständig" die Treppe zu zeichnen

 

Beispiel 2: 20 Turtles zeichnen gleichzeitig, jede im eigenen Threads.

Source mit Online-Compiler bearbeiten

App installieren auf Smartphone, Tablet oder Emulator

QR-Code

Sources downloaden (Tu22.zip)

// Tu22.java

package app.tu22;

import turtle.*;

public class Tu22 extends Playground
{
  void main()
  {
    for (int = 0; i < 20; i++)
      new PainterTurtle();
  }

  class PainterTurtle extends Turtle implements Runnable
  {
    PainterTurtle()
    {
      new Thread(this).start();
      setHeading(360 * Math.random());
    }

    public void run()
    {
      fd(50 + 100 * Math.random());
      lt(45);
      for (int = 0; i < 10; i++)
      {
        fd(50);
        bk(50);
        rt(20 * Math.random());
      }
    }
  }
}
 

Erklärungen zum Programmcode:

new Thread(this).start()

Neuer Thread wird erzeugt und gestartet

setHeading(360 * Math.random());

Die Startrichtung der Turtles wird zufällig gesetzt

for (int i = 0; i < 15; i++)
      new PainterTurtle()
Im main() werden 15 PainterTurtle erzeugt. Jede von ihnen bewegt sich selbstständig im eigenen Thread.

 

Die Turtles zeichnen gleichzeitig je einen Turm. Eine ähnliche Aufgabe ohne Threads findet man unter dem Menüpunkt Mehrere Turtles.

Source mit Online-Compiler bearbeiten

App installieren auf Smartphone, Tablet oder Emulator

QR-Code

Sources downloaden (Tu23.zip)

// Ex23.java

package app.tu23;

import turtle.*;

public class Tu23 extends Playground
{
  void main()
  {
    Turtle joe = new PainterTurtle(-100-100, RED);
    Turtle lisa = new PainterTurtle(-15-100, YELLOW);
    Turtle sara = new PainterTurtle(70, -100, GREEN);
  }

  class PainterTurtle extends Turtle implements Runnable
  {
    PainterTurtle(double x, double y, int c)
    {
      super(x, y, c);
      setPenColor(c);
      new Thread(this).start();
    }

    public void run()
    {
      for (int = 0; i < 6; i++)
        square();
    }

    private void square()
    {
      for (int = 0; k < 4; k++)
      {
        fd(30);
        rt(90);
      }
      fd(30);
    }
  }
}
 

Erklärungen zum Programmcode:

PainterTurtle(double x, double y, int c)

Dem Konstruktor wird die Startposition und die Farbe übergeben

super( x, y, c);

Der Konstruktor von Turtle wird mit der Startposition und Farbe initialisiert

new Thread(this).start();

Ein neuer Thread wird erzeugt und gestartet. Für jede Instanz der Klasse PainterTurtle wird ein Thread erzeugt

Turtle joe = new PainterTurtle(-100, -100, RED); In main() werden drei PainterTurtles erzeugt. Diese beginnen "selbständig" zu zeichnen