8

デッドロック状態でスタックしているスレッドを強制終了したいと思います。まず、のクラスのメソッドを使用して、デッドロック状態のスレッド ID を検出できます。findDeadlockedThreads()ThreadMXBeanjava.lang.management

次に、スレッド ID でスレッドを強制終了したいので、関連する 2 つの質問があります。
(1) スレッド ID でスレッドの制御を取得するにはどうすればよいですか?
(2) ブロックされたスレッドを強制終了するには? interrupt() メソッドを呼び出すと、スレッドに例外が発生し、スレッドが強制終了されると思います。

4

3 に答える 3

6

java.util.concurrent.Lock.lockInterruptively() メソッドは割り込み可能ですが、はるかに一般的な同期ロックは割り込み可能ではありません。ドキュメントに記載されているように、デッドロックされたスレッドを列挙する機能は、デバッグを支援することを目的としており、運用環境で回復する手段としては意図されていません。

本番環境では、プロセス全体を終了して再起動する方がおそらく安全です。

于 2009-12-04T22:27:49.480 に答える
3

Thread.stop() でさえ、組み込みロックでデッドロックされたスレッドを停止できません。スレッドが固有ロックを待ってブロックされている場合、スレッドが最終的にロックを取得し、別の方法で注意を引くことができるように十分に進行することを確認する以外に、スレッドを停止するためにできることはありません。Lock.lock() を介して動作します。

于 2011-09-10T07:24:11.790 に答える
3

ルート スレッドグループから、実行中のすべてのスレッドを Thread クラスに列挙させることができます。次に、ID に一致するもので Thread.stop を呼び出すことができます。

そうは言っても、オブジェクトを一貫性のない状態のままにする可能性があるため、これは非常に危険です。割り込みメソッドによって、同期ロックの待機中にスタックしているスレッドが解放されるとは思わないので、(邪悪な) 停止メソッド

「 Java スレッドプリミティブの非推奨」も参照してください。

于 2009-12-04T22:17:01.073 に答える