Javaでデッドロックのスレッドを殺すためにどのように?
-
13-09-2019 - |
質問
私は、デッドロック状態で立ち往生しているスレッドを殺すしたいと思います。まず、我々は そこで、私は、スレッドIDによってスレッドを殺すしたいと思いますので、私は2つの関連質問があります。findDeadlockedThreads()
にThreadMXBean
クラスのjava.lang.management
メソッドを使用してこのデッドロック状態のスレッドIDを検出href="https://stackoverflow.com/questions/217113/deadlock-in-java">を
(1)スレッドIDによってスレッドの制御を取得する方法?
(2)どのようにブロックされたスレッドを殺すために?私はinvokting割り込みは()メソッドは、スレッドの例外を与えると、スレッドを殺すだろうと思います。
解決
ルートスレッドグループからは、Threadクラスは、実行中のすべてのスレッドを列挙することができに。次に、あなたのIDと一致するものではThread.stopを呼び出すことができます。
これが原因矛盾した状態にあるオブジェクトを残す可能性に非常に危険である、と述べました。私は、interruptメソッドは、スレッドがそれが同期ロックで待機中で立ち往生されて解放されることになりますと信じているので、(悪)
メソッドを停止しません他のヒント
java.util.concurrent.Lock.lockInterruptibly()メソッドは、はるかに一般的な同期ロックはないが、割込み可能です。ドキュメントで述べたように、デッドロックのスレッドを列挙する能力はデバッグ支援機能としてではなく、本番環境で回復する手段として意図されています。
の生産では、全体のプロセスを終了して再起動することはおそらく安全です。
でもThread.stopの()は、固有のロックでデッドロックスレッドを停止することができない。場合スレッドが固有ロックを待ってブロックされている、あなたはそれが最終的にロックを取得し、あなたには、いくつかの他の方法の注意を得ることができることを十分に進行することを保証することは、短い停止するようにできることは何もありません。それはロックで動作しますをスルーの.lock()。