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

6voto

Nikhil A A Punkte 411

Ein Grund, warum Sie eine Schnittstelle implementieren möchten, anstatt eine Basisklasse zu erweitern, ist, dass Sie bereits eine andere Klasse erweitern. Sie können nur eine Klasse erweitern, aber Sie können eine beliebige Anzahl von Schnittstellen implementieren.

Wenn Sie Thread erweitern, verhindern Sie im Grunde, dass Ihre Logik von einem anderen Thread als "this" ausgeführt wird. Wenn Sie nur wollen einige Thread zur Ausführung Ihrer Logik zu verwenden, ist es besser, nur Runnable zu implementieren.

1 Stimmen

Ja, durch die Implementierung der Runnable-Schnittstelle können Sie Ihre eigene Logik implementieren, indem Sie eine beliebige Klasse erweitern, weshalb Runnable meist der Thread-Klasse vorgezogen wird.

6voto

didierc Punkte 14337

Das ist die S de SOLID : Einzelne Verantwortung.

A Gewinde verkörpert die laufender Kontext (wie im Ausführungskontext: Stack-Frame, Thread-ID usw.) der asynchrone Ausführung eines Codestücks. Das Codestück sollte idealerweise die gleiche Implementierung sein, egal ob synchron o asynchrone .

Wenn man sie in einer Implementierung bündelt, erhält das resultierende Objekt zwei Unabhängig Ursachen des Wandels:

  1. Handhabung von Threads in Ihrer Anwendung (d.h. Abfragen und Ändern des Ausführungskontexts)
  2. Algorithmus, der durch das Codestück implementiert wird (der ausführbare Teil)

Wenn die von Ihnen verwendete Sprache partielle Klassen oder Mehrfachvererbung unterstützt, können Sie jede Ursache in eine eigene Superklasse auslagern, aber es läuft auf dasselbe hinaus wie das Zusammensetzen der beiden Objekte, da sich ihre Merkmalsmengen nicht überschneiden. Das war's mit der Theorie.

In der Praxis muss ein Programm im Allgemeinen nicht komplexer sein als nötig. Wenn Sie einen Thread haben, der an einer bestimmten Aufgabe arbeitet, ohne diese Aufgabe jemals zu ändern, macht es wahrscheinlich keinen Sinn, die Aufgaben zu separaten Klassen zu machen, und Ihr Code bleibt einfacher.

Im Kontext der Java da die Einrichtung schon da ist es wahrscheinlich einfacher, direkt mit einer eigenständigen Lösung zu beginnen. Runnable Klassen und übergeben ihre Instanzen an Thread (oder Executor ) Instanzen. Sobald gebraucht nach diesem Muster ist es nicht schwieriger zu verwenden (oder sogar zu lesen) als der einfache Fall eines lauffähigen Threads.

6voto

developer110 Punkte 508

Runnable ist eine Schnittstelle, während Thread ist eine Klasse, die diese Schnittstelle implementiert. Aus gestalterischer Sicht sollte es eine klare Trennung zwischen der Definition einer Aufgabe und ihrer Ausführung geben. Ersteres liegt in der Verantwortung einer Runnalbe Implementierung, und letztere ist Aufgabe der Thread Klasse. In den meisten Fällen wird die Implementierung Runnable ist der richtige Weg.

6voto

Govula Srinivas Punkte 173

Durch die Trennung der Thread-Klasse von der Runnable-Implementierung werden auch mögliche Synchronisierungsprobleme zwischen dem Thread und der run()-Methode vermieden. Eine separate Runnable-Implementierung bietet im Allgemeinen mehr Flexibilität bei der Art und Weise, wie runnable Code referenziert und ausgeführt wird.

6voto

user2771655 Punkte 1022

Wenn Sie runnable verwenden, können Sie den Platz für die Erweiterung auf eine andere Klasse sparen.

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