8 Stimmen

Wie beendet man blockierte Threads in Java?

Ich möchte Threads beenden, die in einem Deadlock-Zustand feststecken. Zuerst können wir Thread-IDs im Deadlock-Zustand erkennen unter Verwendung der findDeadlockedThreads() Methode der ThreadMXBean Klasse in java.lang.management .

Dann möchte ich die Threads nach Thread-IDs löschen und habe daher zwei damit verbundene Fragen:
(1) Wie erhält man die Kontrolle über einen Thread anhand der Thread-ID?
(2) Wie kann man einen blockierten Thread beenden? Ich denke, dass das Aufrufen der interrupt()-Methode eine Ausnahme für den Thread auslöst und den Thread beendet.

6voto

Mark Thornton Punkte 1855

Die Methode java.util.concurrent.Lock.lockInterruptibly() ist unterbrechbar, das weitaus häufigere synchronisierte Sperren ist es nicht. Wie in der Dokumentation erwähnt, ist die Möglichkeit, blockierte Threads aufzuzählen, als Hilfe zur Fehlersuche 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.

3voto

jsight Punkte 27087

Von der Root-Thread-Gruppe aus können Sie die Thread-Klasse alle laufenden Threads aufzählen . Dann können Sie Thread.stop für denjenigen aufrufen, der Ihrer ID entspricht.

Dies ist jedoch sehr gefährlich, da die Objekte in einem inkonsistenten Zustand bleiben können. Ich glaube nicht, dass die Interrupt-Methode dazu führt, dass ein Thread freigegeben wird, der in der Warteschleife einer Synchronisationssperre feststeckt, so dass die (bösen) Stop-Methoden

Siehe auch: " Java Thread Primitive Verwerfung ".

3voto

Mike Punkte 18362

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X