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.
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 ".
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.
Sogar Thread.stop () kann den Thread nicht stoppen, der durch intrinsische Sperre blockiert ist. Wenn ein Thread blockiert ist, wartet er auf eine intrinsische Sperre Sperren, es gibt nichts, was Sie tun können, um es zu stoppen, kurz bevor Sie sicherstellen, dass es schließlich die Sperre erwirbt und genug Fortschritte macht, dass Sie seine Aufmerksamkeit auf andere Weise erhalten können. Es funktioniert mit Lock.lock () durch.
Tags und Links java multithreading deadlock interrupt