web-dev-qa-db-ja.com

サーブレットリクエストを処理するためにスレッドはどのように割り当てられますか?

リクエストごとのスレッドと接続ごとのスレッドとは何ですか?サーブレットはどのモデルで動作しますか? HTTP要求を処理するためのスレッドの割り当て方法スレッド/リクエストまたは接続ですか?

ServletdoGet()メソッドで時間のかかるタスクを非同期に実行したい場合、Java executorsを使用して新しいスレッドを開始し、計算は別のスレッドで行われ、応答はすぐに送信されます。

これで、HttpServletRequestを処理していたスレッドが解放されたか、または子スレッドがまだ実行されているためにまだ使用されているかを確認できますか?

50
hellojava

要求ごととは、HTTP要求が作成されると、スレッドが作成されるか、プールから取得されて処理されることを意味します。 1つのスレッドがリクエスト全体を処理します。接続ごとのスレッドは、スレッドが接続全体に使用されることを除いて同じものになります。スレッドは複数の要求である可能性があり、要求間で多くのデッドタイムが発生する可能性もあります。サーブレットコンテナはリクエストごとのスレッドです。接続ごとにスレッドを提供する実装がいくつかあるかもしれませんが、私にはわかりませんし、非常に無駄が多いようです。

別のスレッド内にスレッドを作成しても、特別な関係は確立されません。ほとんどの場合、そうすることの全体的なポイントは、他のスレッドが作業を継続している間に、1つのスレッドに作業を追加するか終了させることです。シナリオでは、別のスレッドを使用して要求に必要な作業を行うと、予想どおり、応答をすぐに送信できます。その要求を処理するために使用されるスレッドは、他のスレッドが完了するまでにかかる時間に関係なく、別の要求でもすぐに使用可能になります。これは、要求ごとのスレッドサーブレットコンテナで非同期作業を行う方法です。

警告:完全なJava EEコンテナにいる場合、スレッドは、独自に生成するのは悪い考えになる方法で管理されます。その場合、コンテナにスレッドを要求する方が良いですが、一般的な原則は同じです。

56
Ryan Stewart