Wie lassen sich Threads mit Hilfe des Interfaces Runnable realisieren?

Runnable wird von Klassen implementiert, deren Instanzen als Thread laufen sollen. die jedoch nicht selbst von Thread abgeleitet sind, da die Klasse Thread selbst Runnable implementiert. Die Methode run() muss hierbei deklariert werden.

Generell muss folgendermaßen vorgegangen werden:

Die Klasse Digitaluhr wird von JPanel abgeleitet. Zur Darstellung wird eine Instanz in main() einem JFrame hinzugefügt.
Eine das Interface Runnable implementierende Klasse muss die parameterlose Methode run() enthalten. Sie wird dann aufgerufen, wenn eine Runnable implementierende Klasse ein Thread-Objekt bildet. Hier wird in ihr zunächst ein Date-Objekt gebildet. Dies gibt das aktuelle Datum nebst Zeitangabe aus, was anschließend auf einem JLabel dargestellt wird. In der Folge ruht der aktive Thread für genau eine Sekunde. Anschließend wird wiederum ein neues Date-Objekt gebildet.
Der ausführende Thread selber wird über eine Methode start() bereits im Konstruktor gebildet und mittels Thread.start() auch gestartet.

import java.awt.Font;
import java.util.Date;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Digitaluhr extends JPanel implements Runnable {

private static final long serialVersionUID = 1L;

private JLabel label;

private Date date;

private Font font = new Font("Verdana", Font.PLAIN, 20);

private Thread thread;

public Digitaluhr() {
    label = new JLabel();
    label.setFont(font);
    this.add(label);
    start();
}

private void gibDate() {
    label.setText(date.toString());
}

public void start() {
    if (thread == null) {
        thread = new Thread(this);
        thread.start();
    }
}

public void run() {

    while (true) {
        date = new Date();
        gibDate();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
                e.printStackTrace();
        }
    }
}

public static void main(String[] args) {
    Digitaluhr c = new Digitaluhr();
    JFrame f = new JFrame();
    f.add(c);
    f.setSize(350, 60);
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
}
}