Wie kann man einen Thread in Java im Status RUNNING beenden?

8

Es ist möglich, einen Thread, der sich im Status RUNNING befindet, nicht programmatisch zu löschen?

Ich weiß, dass top -Befehl in *nix Threads anzeigen kann. Kann ich den Thread im Betriebssystem beenden?

Ich würde gerne wissen, ob es eine Möglichkeit gibt, einen Thread mit einem Prozess zu verknüpfen, so dass ich nur diesen bestimmten Thread und nicht die Anwendung beenden kann.

Wir hatten einen Fehler in unserem Code, der einen Thread im Zustand RUNNING in einer synchronisierten Methode behielt. Der Thread behielt die lock auf dem Objekt, um die Anwendung "zu hängen".

Der Fehler ist behoben. Aber ich frage mich, ob das möglich ist.

    
ssedano 18.11.2011, 10:08
quelle

4 Antworten

9

Die kurze Antwort ist "vielleicht, aber Sie sollten nicht und die meiste Zeit wird es auch nicht funktionieren".

Die lange Antwort lautet:

"Vielleicht ..." Einige JVM-Implementierungen ordnen Java-Threads OS-Threads zu, andere nicht. Wenn die JVM eine Zuordnung zu einem nativen Betriebssystemthread durchführt, können Sie diesen Thread möglicherweise mit einem vom Betriebssystem bereitgestellten Prozesswerkzeug (wie kill on * nix) beenden. Wenn die JVM grüne Threads erstellt, also keinen Java-Thread einem Thread auf Betriebssystemebene zuordnet, haben Sie mit Tools auf Betriebssystemebene grundsätzlich kein Glück. Glücklicherweise tun dies nur sehr wenige JVM-Implementierungen. Ein Ansatz, der unabhängig davon verwendet werden kann, auf welche Weise die JVM ihre Threads organisiert, verwendet den Java-Debugger. Dieser Artikel beschreibt die Vorgehensweise: Ссылка .

"aber Sie sollten es nicht tun" Das Töten eines Threads auf der Betriebssystemebene wird die JVM mit hoher Wahrscheinlichkeit in einen undefinierten Zustand versetzen (lesen Sie, dass "jvm möglicherweise alle Dateien auf Ihrer Festplatte zum Absturz bringt oder löscht, oder tun Sie, was immer es gerade macht"). Selbst wenn Sie den Debugger-Weg gehen, wird nur eine sehr kleine Menge von Java-Anwendungen (lesen Sie "keine Anwendung auf diesem Planeten gemacht") richtig behandeln das Ereignis, dass eine externe Anwendung einen seiner Threads tötet. Als Folge werden diese Anwendungen in einen undefinierten Zustand versetzt (lesen Sie "Anwendung könnte zum Absturz bringen oder alle Dateien auf Ihrer Festplatte löschen oder tun was auch immer es frust gerne tut").

"und die meiste Zeit wird es auch nicht funktionieren" Wenn der Thread wirklich mit einer blockierten E / A usw. blockiert ist, dann wird der Thread nicht funktionieren, er wird einfach nicht antworten. Wenn ein Programm blockiert ist, ist es wahrscheinlich besser, das ganze Programm zu beenden, das Problem mit dem Programm zu finden und es zu reparieren, anstatt einen einzelnen Thread zu löschen.

    
Jan Thomä 18.11.2011, 10:33
quelle
2

Für all Ihre Zweifel, einen Thread zu töten, beziehen Sie sich auf: Ссылка

    
allwyn.menezes 18.11.2011 10:13
quelle
1

Unter Linux gibt es einen tkill(int tid, int sig) Befehl, ähnlich wie kill .

Unter Windows kann ProcessExplorer es von gui aus tun, ich weiß nicht, ob es da ist alles mit Cli.

    
Denis Tulskiy 18.11.2011 10:31
quelle
0

Thread.interrupt Methode zum Anfordern des Herunterfahrens eines Threads ..
Oder wenn Sie einen Thread-Pool verwenden, dann executorService.shutdown() and executorService.shutdownNow() should be used to shutdown the thread

    
Sumit Singh 18.11.2011 10:22
quelle

Tags und Links