Extends Thread oder implements Runnable: Wie Sie das Vorstellungsgespräch nicht vermasseln

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

implements Runnable vs extends Thread: Warum irren sich 90% der Java-Entwickler?

\n\n

Stellen Sie sich vor: Sie sind in einem Vorstellungsgespräch bei einem großen IT-Unternehmen. Der Personaler lächelt und stellt eine "einfache" Frage: "Was ist der Unterschied zwischen implements Runnable und extends Thread in Java?". Es scheint, was ist daran schon schwer? Aber genau hier, so die Daten von Stack Overflow, stolpern selbst erfahrene Entwickler. Tausende von Aufrufen, hunderte Kommentare – das Thema "Java Runnable vs Thread" bleibt eines der heißesten.

\n\n

In diesem Artikel werden wir nicht einfach die Unterschiede auflisten. Wir analysieren die Top-5 echten Fehler, die Programmierer machen, und zeigen, wie man sauberen, skalierbaren Multithreading-Code schreibt. Wenn Sie in Java programmieren und Thread direkt verwenden – lesen Sie aufmerksam. Vielleicht bemerken Sie selbst nicht, wie Sie sich Probleme schaffen.

\n\n

Kurze Einführung: Was sind Thread und Runnable?

\n\n

Bevor wir in die Tiefe gehen, frischen wir die Grundlagen auf. Java Thread ist eine Klasse, die einen Ausführungsstrang repräsentiert. Sie kann Code im parallelen Modus ausführen. Runnable ist ein funktionales Interface mit der einzigen Methode run(). Es beschreibt eine Aufgabe, die ausgeführt werden soll, weiß aber nicht, wie man sie startet.

\n\n

Hier ist ein klassisches Beispiel mit extends Thread:

\n\n
public class MyThread extends Thread {\n    @Override\n    public void run() {\n        System.out.println("Thread läuft: " + Thread.currentThread().getName());\n    }\n\n    public static void main(String[] args) {\n        MyThread t = new MyThread();\n        t.start(); // Start eines neuen Threads\n    }\n}
\n\n

Und hier die gleiche Funktionalität mit implements Runnable:

\n\n
public class MyTask implements Runnable {\n    @Override\n    public void run() {\n        System.out.println("Aufgabe wird ausgeführt: " + Thread.currentThread().getName());\n    }\n\n    public static void main(String[] args) {\n        Thread t = new Thread(new MyTask());\n        t.start();\n    }\n}
\n\n

Auf den ersten Blick ist der Unterschied minimal. Aber der Teufel steckt, wie immer, im Detail.

\n\n

Top-5 Fehler bei der Arbeit mit Thread und Runnable

\n\n

Fehler Nr. 1: Thread-Vererbung, wo Runnable benötigt wird

\n\n

Das häufigste Problem ist die starre Kopplung an die Thread-Klasse. Wenn Sie extends Thread schreiben, wird Ihre Klasse zu einem Thread. Sie verlieren die Möglichkeit, eine andere Klasse zu vererben. Java ist eine Sprache mit einfacher Vererbung, und das ist eine ernsthafte Einschränkung.

\n\n

Beispiel für schlechten Code:

\n\n
public class DataProcessor extends Thread {\n    // Kann jetzt nicht mehr JFrame, ArrayList oder eine andere nützliche Klasse erweitern\n    @Override\n    public void run() {\n        // Datenverarbeitung\n    }\n}
\n\n

So sollte es sein: Verwenden Sie implements Runnable. Es ist ein Interface – Sie können es in jeder Klasse implementieren, die bereits etwas anderes erbt.

\n\n
public class DataProcessor extends BaseService implements Runnable {\n    @Override\n    public void run() {\n        // Datenverarbeitung\n    }\n}
\n\n

Fehler Nr. 2: Verwechslung von run() und start()

\n\n

Ein Klassiker. Anfänger (und nicht nur sie) rufen oft run() anstelle von start() auf. Der Unterschied ist entscheidend: start() erzeugt einen neuen Thread und ruft darin run() auf. run() hingegen wird im aktuellen Thread ausgeführt, wie eine normale Methode.

\n\n

Beispiel für einen Fehler:

\n\n
Thread t = new Thread(new MyTask());\nt.run(); // Funktioniert, aber im selben Thread! Kein Multithreading.
\n\n

Die Ausgabe auf der Konsole erfolgt im Hauptthread main, nicht in einem neuen. Der Fehler ist schwer zu erkennen, weil der Code nicht abstürzt – er macht nur nicht das, was Sie erwarten.

\n\n

Wie man es vermeidet: Verwenden Sie immer start(), um einen neuen Thread zu starten. Wenn Sie sich unsicher sind

Blogs

Buchempfehlungen