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.
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
0 Stimmen
@bestsss, ich versuche herauszufinden, was Sie mit der Behandlung von interrupt() meinen könnten. Versuchen Sie, die Methode zu überschreiben?
0 Stimmen
@Bob, ja bob. Java macht das natürlich für
java.nio.channels.InterruptibleChannel
(s) Sie können einen Blick auf die Impl. von Thread.interrupt() werfen. Mit Hilfe der Hilfe voninterrupt()
caller ist eine Idee und ein nützlicher Ansatz, der wiederum nicht für Anfänger empfohlen wird.0 Stimmen
@Bob, es gibt noch eine andere Möglichkeit, nämlich die Erweiterung
java.nio.channels.spi.AbstractSelector
und außer Kraft setzenwakeup()
aber das ist eine viel zu schmutzige Art, den Fall zu beurteilen :)8 Stimmen
Ja, laut Code kann die Klasse Thread A jede Klasse erweitern, während die Klasse Thread B keine andere Klasse erweitern kann.
0 Stimmen
Sollte bei der Implementierung eines Callback über Runnable jetzt aussehen.
0 Stimmen
@RichieHH - das kommt darauf an. Rufen Sie nur zurück, wenn Sie einen Rückruf benötigen. Das heißt, wenn der laufende Code (die
Runnable
in OP) muss die Logik im Aufrufer ausführen.0 Stimmen
Lasse ich den Lauf leer? Wenn ich Funktionen verwende, laufen sie dann in einem anderen Thread?
0 Stimmen
Komposition ist im objektorientierten Design der Vererbung vorzuziehen
0 Stimmen
Verwenden Sie nicht direkt Thread, sollten Sie ExecutorService verwenden, die für bessere Tests gespottet werden kann
0 Stimmen
Erweitern Sie Thread, wenn Sie die Art und Weise, wie Thread sich verhält, VERÄNDERN wollen. Implementieren Sie runnable, wenn Sie einen anderen Thread erweitern müssen. Wenn Sie ein Objekt zwischen Threads teilen müssen, ist Runnable der richtige Weg, da Thread dies nicht erlaubt. Wenn keiner der beiden Fälle zutrifft, ist Runnable semantisch korrekter, obwohl dieser letzte Punkt nicht sehr wichtig ist, da jemand denken könnte, dass Sie das Verhalten von Thread geändert haben, wenn Sie ihn erweitern, obwohl Sie das nicht tun.