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.
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.
Für all Ihre Zweifel, einen Thread zu töten, beziehen Sie sich auf: Ссылка
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.
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
Tags und Links java multithreading