2011-08-29 8 views
5

私たちのアプリケーションにgroovy-shell-serverを追加したいと思います。私たちは最近、社内APIへの呼び出しが診断を迅速化したり、短期的な修正を提供したりした場合に、いくつかの生産上の問題に直面しています。 Groovy-shell-serverはこれを実現する良い方法を提供します。暴走するGroovyShellサーバスレッドでThread.stopを呼び出すのは危険ですか?

実際には、これを実稼働環境で使用すると、潜在的な複雑さが生じます。注意深いピアレビューにもかかわらず、私たちはCPUをペグするスクリプトを実行するか、無限ループに陥ってしまうとしましょう。私はそのスレッドを殺すためにいくつかの方法が必要です。だから私はGroovy-shell-serverを強化して、実行中のGroovyクライアントスレッドのオプションのhard stop()をサポートすることを考えていました。

私はそれを知っていますThread.stop() is inherently unsafe;それはdiscussed on StackOverflow beforeでした。私の質問は、利益がこの場合のリスクを上回るかもしれないと思いますか? Thread.stop()を暴走しているGroovyShellサーバスレッドの「緊急ブレーキ」の一種として実用的な選択肢としていますか?または、不整合な状態にオブジェクトを残す可能性が高すぎますか?

(誰かが、実行中のJavaアプリケーションへのプログラム、割り込みアクセスを提供するためのより良い方法を持っている場合は代わりに、私はすべての耳だ。)

答えて

4

私は、一般的には非推奨使用することが悪いことだと思いますAPI、具体的にはThread.stop()を使用することはお勧めしません。

ただし、例外はありません。私はこれが事実だと思います。私の経験によると、Thread.stop()は本当にスレッドを停止します。何年も前にNetscapeを対象としたアプレットで使用しました。一部のバージョンはThread.interrupt()をサポートしていませんでした。

私が考えることのできる唯一の代替ソリューションは、別のプロセスを使用することです。しかし、この場合は、データ転送のためにプロセス間転送を実装する必要があります。私はあなたの仕事の詳細を知らないが、通常は価格が高すぎる。

私があなただったら、Thread.stop()を非常に大きな謝罪の言葉で使用したいと思います。

+0

Thread.stop()が実際にスレッドを停止するかどうかは、実際には論争していません。問題は、さまざまなオブジェクトを悪い状態にする可能性があるためスレッドを停止することが危険すぎるかどうかです。一般的には、利益はリスクを上回る1つのケースであると私はあなたに同意すると思うが、 – greghmerrill

+1

@greghmerrill * Thread.stop()は本当にスレッドを停止します。これは確実です。*、必ずしもモニター上で待機しているスレッドが停止しているわけではありません(ロック先を保持するスレッドをkillする必要があります)。 'Thread.stop()'はあなたがそれを使うことができるかどうかを知っている場合にスタックトレースを調べ、危険な瞬間をマークするために*ほとんど* okです。代わりに、コードを補完して 'Thread.interrupt()'をチェックするコードエンハンサーを使用するか、他の静的*安全ポイント*を呼び出してThreadDeathと似たエラーをスローします。 – bestsss

+0

@bestsss _必ずしもモニタ上で待機しているスレッドは停止していない可能性があります(つまり、最初にロックを保持しているスレッドを終了させる必要があります)_ - これは私にとってはニュースです。私は[試してみた](https://gist.github.com/1183567)、あなたは間違いなく正しいです。ロックを取得しているスレッドを止めてもすぐにはそのスレッドを止めませんが、すぐにロックが止まるでしょう獲得しました。 – greghmerrill

関連する問題