2016-01-22 11 views
16

Ich weiß, dass implements Runnable is preferred over extends Thread in Java-Threads, wie es uns erlaubt, eine andere Klasse zu erweitern, wenn es erforderlich ist. Aber wenn das der Fall ist, hat extends Thread auch seine eigenen Vorteile gegenüber implements Runnable und wenn ja, was sind diese Vorteile?Warum existiert 'extends Thread', wenn 'runnable' implementiert ist in allen Fällen der Gewinner

+4

@proudandhonour: Ja, ich lese die Antwort für diese Frage, aber alle Antworten erklären, wie 'implementiert runnable' ist gut. Und tatsächlich haben diese Antworten diese Frage in meinem Kopf hervorgerufen. – rahul

+1

@proudandhonour Würden Sie gerne auf die Antwort, die diese Frage beantwortet, klicken? Es scheint nicht in den ersten paar. – djechlin

+0

betrachten Szenario, wenn Thread startet, möchten Sie die Details dieses bestimmten Thread der DB hinzufügen. Dies unterscheidet sich von der Geschäftslogik, die Sie in der Methode run() haben. Daher möchten Sie sie getrennt halten. Daher überschreiben Sie sowohl start() als auch run() –

Antwort

30

Weil manchmal (fast nie, aber manchmal) Sie in der Lage sein möchten, das Grundverhalten von Thread zu ändern.

Das ist, wenn Sie es erweitern müssen.

Sie können dies ändern, indem Sie eine Methode aus der Klasse Thread überschreiben. Sie können dies nicht tun, indem Sie eine aus Runnable implementieren.

+6

Beispiel [hier] (http://stackoverflow.com/questions/34905333/in-run-method-how-to-find-from-where-start- war/34905821 # 34905821) - Fragesteller wollte wissen, welcher Thread diesen Thread erstellt/gestartet hat. Überschreibt den Konstruktor und 'start' um dies zu tun. – OldCurmudgeon

18

In den letzten 20+ Jahren, seit Java 1.0 veröffentlicht wurde, hat sich ein als gut angesehenes Designmuster verändert. Java ist jedoch der Rückwärtskompatibilität verpflichtet, was bedeutet, dass alter Code, der schlechte Entwurfsmuster verwendet, immer noch funktioniert.

Einer meiner Lieblingshasen ist StringBuffer, für die es nie eine gute Idee war, die Methode zu synchronisieren, wurde vor mehr als zehn Jahren ersetzt, aber leider Entwickler nicht daran gehindert, es heute zu verwenden und sogar neue Entwickler verwenden es, obwohl es bereits lange vor der Verwendung von Java veraltet war.

+2

Die Wahl zwischen Blockieren von Runnables und Threads hat nichts mit "Entwurfsmustern" zu tun, die keinen Sinn ergeben. Dies sind zwei verschiedene Anwendungsszenarien – specializt

+0

Die Entwurfsmuster sind Zusammensetzung vs Vererbung. Was sind die zwei verschiedenen Anwendungsfälle, die Sie im Auge haben? Sub-classing 'Thread' ist * sehr selten * um alles außer' run() 'zu überschreiben –

+0

Sie scheinen zu denken, dass ein' Runnable' irgendwie mit einem 'Thread' verbunden ist. Nun, es ist nicht. Überhaupt. Runnables blockieren, ausführbare Algorithmen und Threads sind asynchrone, unabhängige, die noch lange nach dem Ende des aufrufenden Threads laufen können. Bitte schreibe keine Antworten zu Themen, die dir fremd sind, vielen Dank. Diese Frage könnte umformuliert werden zu "Was ist besser: Genmanipulierte Pflanzen oder die letzte Saison des Brechens schlecht?" - berechnet nicht. – specializt