Wie Deadlock-Threads in Java zu töten?
-
13-09-2019 - |
Frage
Ich möchte Fäden töten, die in Systemverklemmungszustand stecken. Erstens können wir Thread-IDs in Systemverklemmungszustand erkennen die findDeadlockedThreads()
Methode der ThreadMXBean
Klasse in java.lang.management
verwendet wird.
Dann würde Ich mag die Fäden von Thread-IDs zu töten, und damit habe ich zwei ähnliche Fragen:
(1) Wie die Steuerung eines Fadens durch Thread-ID zu bekommen?
(2) Wie ein blockierter Thread zu töten? Ich denke, dass invokting Interrupt () -Methode wird eine Ausnahme von dem Thread geben und den Faden töten.
Lösung
Von der Wurzel Thread, können Sie die Thread-Klasse alle laufenden Threads aufzählen . Dann können Sie Thread.stop auf der einen Anruf, dass Ihre ID entspricht.
gesagt hat, dass dies wegen des möglichen höchst gefährlich ist, Objekte in einem inkonsistenten Zustand zu verlassen. Ich glaube nicht, dass die Interrupt-Methode bewirkt, dass ein Thread, dass beim Warten auf einer Synchronisationssperre stecken befreit werden, so dass die (böse) stoppt Methoden
Siehe auch: „ Java-Thread Primitive Deprecation “.
Andere Tipps
Die java.util.concurrent.Lock.lockInterruptibly () Methode ist unterbrechbar, das weitaus häufige synchronisiert Verriegelung nicht. Wie in der Dokumentation erwähnt, ist die Fähigkeit, Deadlock-Threads aufzuzählen ist als Testhilfe gedacht und nicht als Mittel in einer Produktionsumgebung zu erholen.
In der Produktion ist es wahrscheinlich sicherer, den gesamten Prozess und Neustart zu beenden.
Auch Thread.stop () ist nicht in der Lage Gewinde auf intrinsische Sperre Deadlock zu stoppen. Wenn ein Gewinde für eine innere Sperre blockiert warten, gibt es nichts, was Sie es kurz zu gewährleisten, zu stoppen tun können, dass sie schließlich die Sperre erwirbt und machen genug Fortschritte, die man seine Aufmerksamkeit auf eine andere Weise zu bekommen. es funktioniert mit Schloss .lock () durch.