423 Stimmen

Wie kann man einen Thread in Java beenden?

Wie tötet man einen java.lang.Thread in Java?

207voto

JaredPar Punkte 699699

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.

133voto

Fredrik Punkte 5730

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)

22voto

karim79 Punkte 333786

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".

13voto

Steve11235 Punkte 2761

Ich möchte auf der Grundlage der eingegangenen Kommentare einige Bemerkungen hinzufügen.

  1. Thread.stop() hält einen Thread an, wenn der Sicherheitsmanager dies zulässt.
  2. 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?
  3. 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.
  4. stop() erstellt eine neue ThreadDeathError Fehler in der aufrufen Thread und wirft dann diesen Fehler auf den Ziel Thema. Daher ist der Stack-Trace im Allgemeinen wertlos.
  5. In JRE 6, stop() prüft mit dem Sicherheitsmanager und ruft dann stop1() das ruft stop0() . stop0() ist nativer Code.
  6. Ab Java 13 Thread.stop() ist (noch) nicht entfernt worden, aber Thread.stop(Throwable) wurde in Java 11 entfernt. ( Mailingliste , JDK-8204243 )

12voto

VadimPlatonov Punkte 147

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() );

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