2013-03-18 14 views
22

Das Java Thread selbst implementiert ein Java Runnable! und nach den meisten Experten über das Internet, implements Runnable is preferred over extends Thread! obwohl we cannot use utilize Runnable im Sinne von Thread ohne die Thread-Klasse!
Warum bevorzugen wir Runnable über erstreckt Thread da in beiden Fällen die tatsächliche Faden durch den Aufruf einer Thread implementiertes Verfahren angegeben wird (dh start() oder run()), obwohl bei Thread sind wir nicht wirklich „Verlängerung“ die Funktionalität von Thread zu implementieren indem Sie einfach die run() Methode überschreiben?Warum "implementiert Runnable" ist bevorzugt gegenüber "erweitert Thread"?

Ich Entschuldigung, wenn ich verwirre klingen ..!

+0

Threads sind hart kontrollieren. Suchen Sie nach Vollstreckern, um bessere Ansätze zu sehen. Sie nehmen Callables und Runnables, keine Threads. –

Antwort

60

Die häufigste Unterschied ist:

Wenn Sie Thread-Klasse erweitern, können Sie keine andere Klasse erweitern, die Sie benötigen. (Wie Sie wissen, erlaubt Java nicht das Erben von mehr als einer Klasse). Wenn Sie Runnable implementieren, können Sie einen Speicherplatz für Ihre Klasse speichern, um in Zukunft oder in Zukunft jede andere Klasse zu erweitern.

Allerdings ist der signifikante Unterschied.

Wenn Sie die Thread-Klasse erweitern, erstellt jeder Ihrer Threads ein eindeutiges Objekt und verknüpft sich damit. Wenn Sie Runnable implementieren, wird dasselbe Objekt für mehrere Threads verwendet.

prüft dies: http://manikandanmv.wordpress.com/tag/extends-thread-vs-implements-runnable/

+0

Bedeutet für den Fall, dass, für die Anwendung spezifisch, in Zukunft oder jetzt, wir die geerbte Klasse nicht erben müssen (geerbt von Thread) und die Anwendung kein Speicherproblem zu haben scheint, dann Runnable und Thread, beide sollten gleiche Chancen haben ..? – Tariq

+0

ya dann würden sie. – Aashray

+0

Ein OOP, das Grundprinzip ist, "immer auf eine Schnittstelle über eine Implementierung zu programmieren" – footy

4

Eine Klasse darf nur eine Oberklasse haben, kann aber eine beliebige Anzahl von Schnittstellen implementieren. Durch Erweitern von Thread geben Sie die Möglichkeit auf, etwas anderes abzulagern.

1

Java erlaubt nur einfache Vererbung, was bedeutet, dass, wenn Sie von Thread erben werden Sie nicht in der Lage sein, von einer anderen Klasse zu erben. Die Implementierung der Runnable-Schnittstelle hat diese Einschränkung nicht, da Ihre Klasse eine beliebige Anzahl von Schnittstellen implementieren kann.

6

Wenn Ihre Klasse ist die Thread-Klasse erstreckt dann wird es ein einzelner Thread, die die Eigenschaften Thread-Klasse erbt, so dass es dann schwer sein. (Wenn erstreckt Thread-Klasse jeder des Threads erstellt einzigartiges Objekt und assoziiert mit ihm, aber wenn Umsetzung Runnable, teilt das gleiche Objekt mehr Threads).

Wenn Ihre Klasse ist die Runnable-Schnittstelle implementieren dann nur Sie die run() außer Kraft setzen .So diese Instanz eine separate Thread erzeugt und jeder einzelne Faden läuft getrennt, aber nicht als ein einzelnes schweres Thema in Ihrem Programm. Eine andere Sache, Da Java nicht unterstützt Mehrfachvererbung, wenn Sie die Runnable implementieren Sie Probleme mehrerer Verlängerung vermeiden werden, wenn Sie also Runnable Schnittstelle implementieren können Sie jede Klasse erweitern, die Sie anderen erforderlich sind als Gewinde Klasse.

+0

Wie wäre es mit der Speicherverbrauch, ... wird die Ausführung von Runnable und eine neue Thread() Anweisung sind eigentlich gleich? (teuer wenn mehrere Anrufe auf einmal)? – gumuruh

-3

Sie wirklich Sound verwirren.Jedenfalls weiß ich einen Grund dafür, dass wir die gleiche Funktionalität mit Runnable erreichen können, also sollten wir uns dafür entscheiden, denn wenn wir Runnable implementieren, können wir andere Klassen erweitern, was nicht möglich ist, wenn wir die Thread-Klasse erweitern werden.

Verwandte Themen