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

89voto

Herms Punkte 35605

Ich bin überrascht, dass noch nicht erwähnt wurde, dass die Umsetzung Runnable macht Ihren Unterricht flexibler.

Wenn Sie thread erweitern, wird die Aktion, die Sie durchführen, immer in einem Thread stattfinden. Wenn Sie jedoch implementieren Runnable Das muss nicht sein. Sie können sie in einem Thread ausführen, sie an eine Art Ausführungsdienst übergeben oder sie einfach als Aufgabe innerhalb einer Anwendung mit einem einzigen Thread weitergeben (vielleicht, um zu einem späteren Zeitpunkt, aber innerhalb desselben Threads ausgeführt zu werden). Die Optionen sind viel offener, wenn Sie einfach Runnable als wenn Sie sich an Thread .

8 Stimmen

Nun, Sie können dasselbe mit einer Thread Objekt auch, weil Thread implements Runnable ;-) Aber es "fühlt sich besser an", diese Dinge mit einem Runnable als sie mit einer Thread !

9 Stimmen

Richtig, aber Thread fügt eine Menge zusätzlicher Dinge hinzu, die Sie nicht brauchen und in vielen Fällen auch nicht wollen. Es ist immer besser, die Schnittstelle zu implementieren, die dem entspricht, was Sie tatsächlich tun.

86voto

Saif Punkte 6576

Eigentlich ist es nicht klug, zu vergleichen Runnable y Thread Miteinander.

Diese beiden haben eine Abhängigkeit und Beziehung in Multi-Threading genau wie Wheel and Engine Beziehung zum Kraftfahrzeug.

Ich würde sagen, es gibt nur einen Weg für Multithreading mit zwei Schritten. Lassen Sie mich meinen Standpunkt darlegen.

Ausführbar:
Bei der Umsetzung interface Runnable bedeutet dies, dass Sie etwas schaffen, das run able in einem anderen Thema. Etwas zu erstellen, das innerhalb eines Threads ausgeführt werden kann (runnable inside a thread), bedeutet nicht, einen Thread zu erstellen.
Also die Klasse MyRunnable ist nichts anderes als eine gewöhnliche Klasse mit einer void run Methode. Und die Objekte werden gewöhnliche Objekte sein, die nur eine Methode haben run die beim Aufruf normal ausgeführt wird. (es sei denn, wir übergeben das Objekt in einem Thread).

Thema:
class Thread Ich würde sagen, eine sehr spezielle Klasse mit der Fähigkeit, einen neuen Thread zu starten, der tatsächlich Multi-Threading durch seine start() méthode.

Warum ist es nicht klug zu vergleichen?
Denn wir brauchen beide für Multithreading.

Für Multi-Threading benötigen wir zwei Dinge:

  • Etwas, das innerhalb eines Threads laufen kann (Runnable).
  • Etwas, das ein neues Thema (Thread) beginnen kann.

Technisch und theoretisch sind also beide notwendig, um einen Thread zu starten, einer wird laufen. und man wird es zum Laufen bringen (Wie Wheel and Engine eines Kraftfahrzeugs).

Deshalb können Sie kein Thema mit MyRunnable müssen Sie es an eine Instanz von Thread .

Aber ist es möglich, einen Thread zu erstellen und auszuführen, indem man class Thread weil Klasse Thread implementiert Runnable damit wir alle wissen Thread ist auch ein Runnable innen.

Endlich Thread y Runnable ergänzen sich beim Multithreading und sind keine Konkurrenten oder Ersatz.

4 Stimmen

Ganz genau! Das sollte die akzeptierte Antwort sein. Übrigens, ich glaube, die Frage wurde bearbeitet und ThreadA hat keinen Sinn mehr

0 Stimmen

Die akzeptierte Antwort ist viel delegierter Danke für Ihre Antwort @idelvall

1 Stimmen

Die beste Antwort! Danke!

46voto

Fabian Steeg Punkte 43903

Sie sollten Runnable implementieren, aber wenn Sie mit Java 5 oder höher arbeiten, sollten Sie es nicht mit new Thread sondern verwenden eine ExecutorService stattdessen. Für Details siehe: Wie man einfaches Threading in Java implementiert .

5 Stimmen

Ich würde nicht denken, ExecutorService wäre so nützlich, wenn Sie nur einen einzelnen Thread starten wollen.

1 Stimmen

Nach dem, was ich gelernt habe, sollte man im Allgemeinen nicht mehr selbst einen Thread starten, denn wenn man das dem Ausführungsdienst überlässt, ist alles viel kontrollierbarer (z. B. kann man warten, bis der Thread ausgesetzt wird). Außerdem sehe ich in der Frage nichts, was darauf hindeutet, dass es sich um einen einzelnen Thread handelt.

4 Stimmen

Welchen Sinn hat Multi-Threading, wenn wir schon vorher wissen, dass es ein einzelner Thread sein wird? Nehmen wir also an, wir haben mehrere Threads und diese Antwort ist wertvoll.

35voto

Powerlord Punkte 84404

Ich bin kein Experte, aber mir fällt ein Grund ein, Runnable zu implementieren, anstatt Thread zu erweitern: Java unterstützt nur Einfachvererbung, man kann also nur eine Klasse erweitern.

Bearbeiten: Ursprünglich hieß es auch "Die Implementierung einer Schnittstelle erfordert weniger Ressourcen", aber Sie müssen in beiden Fällen eine neue Thread-Instanz erstellen, daher war dies falsch.

0 Stimmen

In runnable können wir keine Netzwerkaufrufe tätigen, richtig? Da ich Android.os.NetworkOnMainThreadException habe. Aber durch die Verwendung von Threads kann ich Netzwerkaufrufe tätigen. Bitte korrigieren Sie mich, wenn ich falsch bin.

0 Stimmen

@NabeelThobani Normales Java kümmert sich nicht darum, aber es klingt so, als ob Android es tut. Ich bin allerdings nicht vertraut genug mit Android, um das zu sagen.

1 Stimmen

@NabeelThobani Natürlich können Sie das. Wahrscheinlich erstellen Sie keinen Thread mit Ihrer Runnable.

21voto

Bart van Heukelom Punkte 41768

Ich würde sagen, es gibt einen dritten Weg:

public class Something {

    public void justAnotherMethod() { ... }

}

new Thread(new Runnable() {
   public void run() {
    instanceOfSomething.justAnotherMethod();
   }
}).start();

Vielleicht ist dies ein wenig von meiner kürzlichen intensiven Nutzung von Javascript und Actionscript 3 beeinflusst, aber auf diese Weise muss Ihre Klasse nicht eine ziemlich vage Schnittstelle implementieren wie Runnable .

41 Stimmen

Dies ist nicht wirklich ein dritter Weg. Sie sind immer noch Runnable implementieren, nur tun es anonym.

2 Stimmen

@Don Roby: Das ist etwas anderes. Es ist oft praktisch, und Sie können Felder und endgültige lokale Variablen aus der enthaltenen Klasse/Methode verwenden.

7 Stimmen

@BartvanHeukelom Es ist praktisch, aber nicht anders. Sie können dies mit jeder Art von verschachtelter Klasse tun, d.h. mit inneren Klassen, lokalen Klassen und Lambda-Ausdrücken.

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