pp.01.01-Inhertience

Start eines Threads durch und bei Vererbung

  • Projekt: pp.01.01-Inheritance
  • Bearbeitungszeit: 15 Minuten
  • Musterlösung: 15 Minuten
  • Kompatibilität: mindestens Java SE 10

Im Package pp ist die Klasse Thermometer, die von Sensor erbt, welche wiederum von Thread erbt. Thermomenter ist also auch ein Thread und kann nebenläufig durch Aufruf von start() ablaufen.

Jeder Sensor ist nebenläufig. Er hat als generische Funktionalität regelmäßig in einem durch das Property frequency festgelegten Intervall einen Messwert auszulesen. Der Messwert kommt aus der Methode reading(). Inhaltlich ist Sensor abstract. Für Testzwecke können jedoch auch von Sensor Instanzen gebildet werden. Sensor hat eine main-Methode. Hier wird eine Instanz gebildet und sie läuft nebenläufig los, da das so im Konstruktor bestimmt wird.

Sub-Klassen von Sensor, wie Thermometer überschreiben die reading()-Methode. In Thermometer sollen in der main-Methode zwei Instanzen gebildet werden, die mit unterscheidlicher frequency Messungen vornehmen sollen.

Quellcode von pp.Sensor

package pp;

public class Sensor extends Thread {
    // eigentlich abstract

    private final long frequency;

    public Sensor(long frequency) {
        this.frequency = frequency;
        start();
    }

    /**
     * @return the frequency
     */
    public long getFrequency() {
        return this.frequency;
    }

    protected String reading() {
        // eigentlich abstract
        return null;
    }

    @Override
    public void run() {
        while (true) {
            System.out.println("reading: " + reading());
            try {
                Thread.sleep(this.frequency);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }
    }

    public static void main(String... args) {
        var s = new Sensor(1000);
    }
}

Quellcode von pp.Thermometer

package pp;

import java.util.Random;

public class Thermometer extends Sensor {
    private final Random rand;

    public Thermometer(long frequency) {
        super(frequency);
        this.rand = new Random();
    }

    @Override
    protected String reading() {
        return String.format("(%04d freq.): %3d°C", getFrequency(), this.rand.nextInt(100));
    }

    public static void main(String... args) {
        var s1 = new Thermometer(1000);
        var s2 = new Thermometer(3000);
    }
}

Aufgaben

  • Der vorliegende Quellcode ist nur teilweise funktionsfähig. Probieren Sie die main-Methoden von Sensor und Thermometer aus.
  • Analysieren Sie den Programmablauf.
  • Korrigieren Sie das Programm, so dass beide Klassen lauffähig sind.
  • Verallgemeinern Sie Ihre “Findings” zu einem kurzen Merksatz!