Javaアプリサーバーはスレッドを破壊することができますか?はいの場合、どうですか?

StackOverflow https://stackoverflow.com/questions/2300227

質問

スレッドの破壊はJavaで非推奨(Javadocに従って実装されていません)、それを中断することは、スレッド上に辞めると予想されるが、そうしないかもしれない提案にすぎません。 (jの内部のスレッドを殺す方法を提供しないためVM 不穏なデザインですが、私の質問は設計に関連していません。)

Javaアプリケーションサーバーはアプリケーションをどのようにアンロードしますか?彼らは何らかの形でアンロードされているアプリケーションのスレッドを破壊することができますか?はいの場合、どうですか?いいえの場合、Infinite-Loopを備えた展開されたアプリの単一のスレッドは、介入する可能性なしにアプリサーバー全体を倒すことができますか?

このためにテストケースを書いていないことを申し訳ありませんが、実際に何が起こっているのか知りたいです。

役に立ちましたか?

解決

EJBサーバー内で独自のスレッドを作成することは許可されていません。

Webコンテナ(たとえばTomcatなど)にスレッドを生成することはそれほど珍しいことではありませんが、それを行うことを本当に慎重に考える必要があります。そして、それらのスレッドのライフサイクルを必ず管理してください。

他のヒント

jの内部でスレッドを殺す方法を提供しないVM 不穏なデザインですが、私の質問は設計に関連していません。

あなたの本当の質問が答えられているので、私は上記の引用文に対処するつもりです。

歴史は、元々Javaデザイナーです やりました スレッドの殺害と停止の問題に対処するようにしてください。しかし、彼らはJava言語の文脈では解決できなかった根本的な問題に遭遇しました。

問題は、共有データを非原子形式で変異させることができる、または待機/通知メカニズムを使用して他の人と同期することができる安全なスレッドを単に殺すことができないことです。このコンテキストでスレッドの殺害を実装すると、データ構造の部分的な更新や、到着しない通知を待っている他のスレッドが到着することになります。言い換えれば、1つのスレッドを殺すことで、アプリケーションの残りの部分を不確実で壊れた状態に残す可能性があります。

関連する仕様 /教科書がこれを明確にしていなくても、スレッドを殺すことを可能にする他の言語 /ライブラリ(例:C、C ++、C#)は、上記と同じ問題に苦しむことができます。スレッドを殺すことは可能ですが、これを安全に行うには、アプリケーション全体の設計と実装に本当に注意する必要があります。一般的に言えば、正しくするのは難しすぎます。

それで(仮説的に)Javaで糸を安全に殺すために何が必要でしょうか?ここにいくつかのアイデアがあります:

  • JVMが分離株を実装した場合、子供の分離株で殺したいと思う計算を起動できます。問題は、適切に実装された分離株は、メッセージの合格によって他の分離株とのみ通信できることであり、一般的に使用するのがはるかに高価になることです。

  • 共有された可変状態の問題は、突然変異を完全に禁止するか、Java実行モデルにトランザクションを追加することで対処できます。これらは両方とも根本的にJavaを変えます。

  • 待機/通知の問題は、それをランデブーまたはメッセージ通過メカニズムに置き換えることで対処できます。 「他の」スレッドは、これから回復するためにコーディングする必要があります。

編集 - コメントに応じて。

Mutex Deadlockは問題ではありませんでした thread.destroy() 破壊されたスレッドが所有するすべてのミューテックスをリリース(破壊)するように設計されているため。問題は、ロックが壊れた後、ミューテックスによって保護されたデータ構造が正気な状態になるという保証がなかったことでした。

このトピックの歴史を正しく理解すれば、 Thread.suspend(), Thread.delete() 等々 本当にそうしました 現実世界のJava 1.0アプリケーションで問題を引き起こします。そして、これらの問題は非常に深刻であり、アプリケーションライターが対処するのが非常に難しいため、JVMデザイナーは最良のコースが方法を非難することであると判断しました。これは簡単な決断ではなかったでしょう。

今、あなたが勇敢であるなら、あなたは実際にこれらの方法を使用することができます。そして、それらは実際には場合によっては安全かもしれません。しかし、非推奨方法を中心にアプリケーションを構築することは、サウンドソフトウェアエンジニアリングの実践ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top