Wie tötet man einen java.lang.Thread
in Java?
Antworten
Zu viele Anzeigen?Siehe dies Thread von Sun über die Gründe der Abschaffung Thread.stop()
. Darin wird ausführlich dargelegt, warum dies eine schlechte Methode war und was getan werden sollte, um Fäden im Allgemeinen sicher zu stoppen.
Es wird empfohlen, eine gemeinsam genutzte Variable als Flagge zu verwenden, die den Hintergrund-Thread zum Anhalten auffordert. Diese Variable kann dann von einem anderen Objekt gesetzt werden, das die Beendigung des Threads anfordert.
In der Regel ist das nicht der Fall.
Sie fordern ihn auf, seine Arbeit zu unterbrechen, indem Sie Thread.interrupt() (Javadoc-Link)
Eine gute Erklärung, warum, findet sich in der Javadoc hier (Java-Technote-Link)
Eine Möglichkeit besteht darin, eine Klassenvariable zu setzen und sie als Sentinel zu verwenden.
Class Outer {
public static volatile flag = true;
Outer() {
new Test().start();
}
class Test extends Thread {
public void run() {
while (Outer.flag) {
//do stuff here
}
}
}
}
Setzen Sie eine externe Klassenvariable, d.h. flag = true im obigen Beispiel. Setzen Sie sie auf false, um den Thread zu "beenden".
Ich möchte auf der Grundlage der eingegangenen Kommentare einige Bemerkungen hinzufügen.
Thread.stop()
hält einen Thread an, wenn der Sicherheitsmanager dies zulässt.Thread.stop()
ist gefährlich. Wenn Sie jedoch in einer JEE-Umgebung arbeiten und keine Kontrolle über den aufgerufenen Code haben, kann dies notwendig sein; siehe Warum ist Thread.stop veraltet?- Sie sollten niemals einen Container-Arbeitsfaden stoppen. Wenn Sie Code ausführen wollen, der dazu neigt, sich aufzuhängen, starten Sie (vorsichtig) einen neuen Daemon-Thread und überwachen Sie ihn und beenden Sie ihn, wenn nötig.
stop()
erstellt eine neueThreadDeathError
Fehler in der aufrufen Thread und wirft dann diesen Fehler auf den Ziel Thema. Daher ist der Stack-Trace im Allgemeinen wertlos.- In JRE 6,
stop()
prüft mit dem Sicherheitsmanager und ruft dannstop1()
das ruftstop0()
.stop0()
ist nativer Code. - Ab Java 13
Thread.stop()
ist (noch) nicht entfernt worden, aberThread.stop(Throwable)
wurde in Java 11 entfernt. ( Mailingliste , JDK-8204243 )
Es gibt einen Weg, wie Sie das tun können. Aber wenn Sie ihn benutzen müssen, sind Sie entweder ein schlechter Programmierer oder Sie benutzen einen Code, der von schlechten Programmierern geschrieben wurde. Sie sollten also darüber nachdenken, nicht länger ein schlechter Programmierer zu sein oder diesen schlechten Code nicht mehr zu verwenden. Diese Lösung ist nur für Situationen gedacht, in denen es KEINE ANDERE MÖGLICHKEIT gibt.
Thread f = <A thread to be stopped>
Method m = Thread.class.getDeclaredMethod( "stop0" , new Class[]{Object.class} );
m.setAccessible( true );
m.invoke( f , new ThreadDeath() );
- See previous answers
- Weitere Antworten anzeigen