例外を発生させずにJavaスレッドを強制終了することは可能ですか?
これはテスト目的のためだけです。コンピューター全体がスレッドの途中で停止するケースをシミュレートしたいと考えています。
注 - 非推奨のメソッドを見ましたThread.destroy()
が、ドキュメントには最初から実装されていないと書かれています。
例外を発生させずにJavaスレッドを強制終了することは可能ですか?
これはテスト目的のためだけです。コンピューター全体がスレッドの途中で停止するケースをシミュレートしたいと考えています。
注 - 非推奨のメソッドを見ましたThread.destroy()
が、ドキュメントには最初から実装されていないと書かれています。
いいえ。非推奨の「本質的に安全でない」Thread.stop()
メソッドがありますが、そのコメントが強調しているように、物事は深刻な破損状態のままになる可能性があり、スレッド内で ThreadDeath エラーが引き続きスローされます。
stop()
動作するように見えてからずっと後に現れる可能性がある の問題についての Sun の説明は、次のとおりです。
http://java.sun.com/j2se/1.5.0/docs/guide/misc/threadPrimitiveDeprecation.html
JVM プロセスを強制終了する (またはプラグをヤンクする) ことは、コンピューターの死のより良いシミュレーションではないでしょうか?
移植可能な方法はありません。ファイナライザーとシャットダウン フックの実行を抑制したい場合は、Java プロセス全体で "kill -9" (またはローカルで同等のもの) を呼び出してみてください。
このようなテストから再現可能な結果は得られませんが、プログラムがファイル システムまたはデータベースに書き込みを行っており、強制終了されたときに一貫性のないデータ構造が残る可能性がある場合は、そのようなテストを数千回実行することは興味深いかもしれません。 .
または、プロセスを強制終了することもできます。(つまり、これが Linux の場合、プロセスに kill -9 シグナルを送信します)。
何かをテストしようとしている場合は、レースの問題に注意してください。ひどくクラッシュすることを望んでいる場合は、特に運が悪いと、月に 1 回しかクラッシュしない可能性があります。
あなたのテストのポイントは何ですか?Java は、出口が「クリーン」な場合にシャットダウン フックを実行しようとすることを除いて、出口で何が起こるかについて保証を提供しません。
プログラムの動作をテストしようとするのと同じように聞こえますOutOfMemory
。それについてあなたができることは何もなく、何が起こるかを決定論的に伝える方法もありません
Thread.suspend() を使用できない理由はありますか? スレッドが中断されたときに状態を調べることができるように、スレッドを停止します。
Thread.stop() を使用することもできますが、複数の ThreadDeathExceptions がスローされるリスクがあります。try/catch/finally ブロックでラップできますが、保証はありません。
スレッド stop() は、スレッドでエラーをスローします。スレッドデス
スレッドの途中で終了するアプリケーションをシミュレートする唯一の方法は、System.exit() を呼び出すことです。
ただし、これはかなりランダムであるため、アプリケーションがどこで停止しても正しく動作することを確認するには、何度もテストを実行する必要があります。