2009-09-02 7 views
5

他のプログラマーによって開発されたRunnableクラスを実行する必要があり、メソッド実行中にwhile(isRunning == true)を使用できないため、非推奨のstop()を使用する必要があります。本当に必要なら、Javaでthread.stop()を使用できますか?

質問は次のとおりです。)それはメソッドストップを(使用するのに十分安全ですか? Theadsは、ファイル、DB、インターネット接続などのリソースでは動作しません。しかし、stop()メソッドを使用して数十のスレッドを停止した後にJVMが壊れないようにしたいと思います。

P.S:はい、私はそれをテストするためのいくつかのコードを書くことができますが、私は誰かが答えを知っている願っています)の

答えて

6

ソート。 Thread.stop()について本質的に「腐敗している」ものは何もありません。問題は、それらを実行しているスレッドが突然停止したときに、オブジェクトを破損状態のままにすることができることです。プログラムの残りの部分にこれらのオブジェクトの可視性がない場合は、問題ありません。一方、それらのオブジェクトのいくつかがプログラムの他の部分に見える場合は、診断が困難な問題が発生する可能性があります。

+0

オブジェクトが '論理的に'デメリジングされ、phisicallyでない場合、この場合は気にしません)) – Roman

0

JVMが破損している可能性がありますが、そのための条件満たしていないことを確認するために密接にjavadocを読んでいないだろう「災害を。」

あなたは、スレッドが上に保持している任意の同期モニターをよく見て取る必要があります。ファイルやソケットはリソースがハングアップしていると述べましたが、共有データ構造も考慮する必要があります。また、例外処理でRuntimeExceptionがキャッチされないようにしてください(stop()を参照)。

4

Thread.stopを使用する場合は、ユーザーが少ないと仮定すると、おそらく遠ざかります。例外的にテストするのは難しいです。実行中のコードのどこにでも例外が発生する可能性があります。すべての可能な状況をテストすることはできません。あなたの設定のあなたのマシンでは、問題は決して見つけられません。次のJREアップデートに来ると、間違いのある不明なバグでプログラムの起動が失敗する可能性があります。スレッドは、一度にクラスをロードしている場合

例問題の場合です。クラスはロードに失敗し、再試行されません。あなたはプログラムが壊れています。

1

これは私の質問"Are thread stop and friends ever safe?"で解決しました。その答えの1つで、stop()を安全に使用するための前提条件を見つけようとしました。しかし、これはまだ「進行中の作業」です。

ところで:テストコードを書くことは、必ずしも助けにはなりません。 (テストでは、バグの存在を証明するのはバグの存在を証明するものではありません)。しかし、それは簡単ではありません:-)。

関連する問題