Wie man festgefahrene Threads in Java killt?

8

Ich würde gerne Threads beenden, die sich im Deadlock-Zustand befinden. Erstens können wir Thread-IDs im Deadlock-Status erkennen , indem wir die Methode findDeadlockedThreads() der Klasse ThreadMXBean verwenden in java.lang.management .

Dann möchte ich die Threads nach den Thread-IDs abtöten und habe daher zwei verwandte Fragen:
(1) Wie bekomme ich die Kontrolle über einen Thread nach Thread-ID?
(2) Wie man einen blockierten Faden tötet? Ich denke, dass das Aufrufen der interrupt () -Methode eine Ausnahme für den Thread geben wird und den Thread beenden wird.

    
Sangmin 04.12.2009, 22:09
quelle

3 Antworten

3

In der Stammthreadgruppe können Sie die Thread-Klasse alle laufenden Threads auflisten . Dann können Sie Thread.stop auf demjenigen aufrufen, der Ihrer ID entspricht.

Nachdem dies gesagt wurde, ist dies sehr gefährlich, da Objekte in einem inkonsistenten Zustand verbleiben können. Ich glaube nicht, dass die Interrupt-Methode dazu führen wird, dass ein Thread freigegeben wird, der beim Warten auf eine Synchronisationssperre stecken bleibt, also die (bösen) Stopp-Methoden

Siehe auch: " Java Thread Primitive Vernachlässigung ".

    
jsight 04.12.2009, 22:17
quelle
6

Die java.util.concurrent.Lock.lockInterruptibly () -Methode ist unterbrechbar, das weitaus häufigere synchronisierte Locking nicht. Wie in der Dokumentation erwähnt, ist die Möglichkeit, festgefahrene Threads aufzuzählen, als Debughilfe gedacht und nicht als Mittel zur Wiederherstellung in einer Produktionsumgebung.

In der Produktion ist es wahrscheinlich sicherer, den gesamten Prozess zu beenden und neu zu starten.

    
Mark Thornton 04.12.2009 22:27
quelle