2355 Stimmen

"implementiert Runnable" vs. "erweitert Thread" in Java

Nach der Zeit, die ich mit Threads in Java Ich habe diese beiden Möglichkeiten gefunden, Themen zu schreiben:

Mit implementiert Runnable :

public class MyRunnable implements Runnable {
    public void run() {
        //Code
    }
}
//Started with a "new Thread(new MyRunnable()).start()" call

Oder, mit erweitert Thread :

public class MyThread extends Thread {
    public MyThread() {
        super("MyThread");
    }
    public void run() {
        //Code
    }
}
//Started with a "new MyThread().start()" call

Gibt es einen signifikanten Unterschied zwischen diesen beiden Codeblöcken?

66 Stimmen

Vielen Dank für diese Frage, die Antworten haben eine Menge Missverständnisse, die ich hatte, aufgeklärt. Ich schaute in den richtigen Weg, um Java-Threads zu tun, bevor SO existierte und es gab eine Menge von Fehlinformationen / veraltete Informationen da draußen.

5 Stimmen

Gibt es einen Grund, warum Sie den Thread ( aber ich empfehle es nicht ), können Sie präventiv mit interrupt() . Auch hier handelt es sich um eine Idee, die im richtigen Fall nützlich sein könnte, aber ich empfehle sie nicht.

0 Stimmen

Bitte lesen Sie auch die Antwort, die sehr gut erklärt ist: stackoverflow.com/q/5562720/285594

2voto

Grim Punkte 4303

In dem seltenen Fall, dass Sie es nur einmal ausführen, sollten Sie Thread wegen DRY erweitern. Wenn Sie es mehrfach aufrufen, sollten Sie Runnable implementieren, da derselbe Thread nicht neu gestartet werden sollte.

2voto

rashedcs Punkte 3145

Durch die Erweiterung der Thread-Klasse kann die abgeleitete Klasse keine andere Basisklasse erweitern, da Java nur Einfachvererbung zulässt. Im Gegenteil, durch die Implementierung der runnable-Schnittstelle kann die Klasse immer noch andere Basisklassen erweitern.

Der wichtigste Unterschied zwischen der Implementierung von Runnable und der Erweiterung von Thread ist unten aufgeführt:

Durch die Erweiterung von Thread ist die abgeleitete Klasse selbst ein Thread-Objekt, während die Implementierung der Runnable-Schnittstelle dasselbe Objekt für mehrere Threads freigibt.

1voto

Pritam Banerjee Punkte 16396

Die Klasse Thread definiert mehrere Methoden, die overriden durch die erweiternde Klasse. Aber um einen Thread zu erstellen, müssen wir die run() Methode. Das Gleiche gilt für Runnable auch.

Allerdings Runnable ist eine bevorzugte Methode zur Erstellung eines Threads. Die Hauptgründe dafür sind:

  1. Da Runnable eine Schnittstelle ist, können Sie andere Klassen erweitern. Wenn Sie jedoch Thread erweitern, ist diese Möglichkeit nicht mehr gegeben.

  2. Wenn Sie nicht viele Änderungen oder Verbesserungen an den Thread Funktionalitäten und Erweiterung der Thread Klasse ist nicht der bevorzugte Weg.

0 Stimmen

Die Ergänzung der Runnable selbst ist kein Thread, sondern nur eine Aufgabe, die ein Thread ausführen kann.

0voto

samkit shah Punkte 647

Das ist einfach zu sagen: Wenn Sie eine Schnittstelle implementieren, bedeutet das, dass Sie alle Methoden der Schnittstelle implementieren, und wenn Sie die Klasse erweitern, erben Sie die Methoden Ihrer Wahl... In diesem Fall gibt es nur eine einzige Methode namens Run() also besser, die Runnable-Schnittstelle zu implementieren..

0voto

bharatj Punkte 1989

Ich würde sagen, die eigentliche Aufgabe ist vom Thread entkoppelt. Wir können die Aufgabe im Falle von Runnable an Thread, Executor-Framework usw. weitergeben, während bei der Erweiterung von Thread die Aufgabe mit dem Thread-Objekt selbst gekoppelt ist. Die Task-Isolierung kann im Falle der Erweiterung von Thread nicht durchgeführt werden. Es ist, als ob wir die Aufgabe an das Thread-Objekt nur etwas wie IC-Chip brennen (und genauer gesagt wird kein Handle zur Aufgabe erhalten).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X