JavaベースのWebアプリケーションとスタンドアロンJavaアプリケーションのマルチスレッド化の違い


13

私はかなりJavaに慣れておらず、私の経験はWebコンテナ(私の場合はJboss)で実行されているWebベースのアプリケーションに限られています。

Webアプリケーションの場合、Webコンテナがマルチスレッドを処理すると言ってもいいですか?その場合、Webベースのアプリケーションに新しいトレッドを導入できますか?そうすることには利点があり、どのシナリオでそれを行う必要がありますか?


EE6までは、スレッドを使用しないでください。EE7が導入しConcurrency Utilitiesます。
モニカの復活-M.シュレーダー

回答:


20

Webアプリケーションの場合、Webコンテナがマルチスレッドを処理すると言ってもいいですか?

ほとんどのWebサーバー(JavaおよびJBossを含むその他)は「リクエストごとに1つのスレッド」モデルに従います。つまり、各HTTPリクエストは1つのスレッドで完全に処理されます。このスレッドは、多くの場合、DBリクエストなどを待機します。Webコンテナは、必要に応じて新しいスレッドを作成します。

一部のサーバー(主にNettyのJavaエコシステム)は、「1つのスレッドがすべてを実行する」モデルまたはより複雑なモデルのいずれかで、非同期の要求処理を行います。そこにある基本的な考え方は、待機中のスレッドが多いとリソースが無駄になるため、非同期で作業する方が効率的であるということです。

その場合、Webベースのアプリケーションに新しいトレッドを導入できますか?

可能ですが、非常に慎重に行う必要があります。エラー(メモリリークや同期の欠落など)によって、再現が非常に困難なバグが発生したり、サーバー全体がダウンしたりする可能性があります。

そうすることには利点があり、どのシナリオでそれを行う必要がありますか?

さて、利点は、並行して作業できることです。スレッドを使用して純粋な計算速度を向上させることは、他のリクエストの処理を遅くするため、Webサーバー上で実行すべきではありません。そのようなことは、おそらく何らかのジョブキューを使用して、別のサーバーで実行する必要があります。

HTTP要求を処理するコンテキストでのマルチスレッドの正当なシナリオは、他のネットワークリソースにアクセスする必要がある場合(たとえば、いくつかの異なるWebサービスを呼び出す場合)です。単一のスラッドでそれを行う場合、各呼び出しが順番に終了するのを待つ必要があります。ただし、複数のスレッドを使用する場合、合計待機時間は、最も遅い単一の呼び出しの遅延のみです。


3
理にかなっています。ExecutorService Interfaceは、Webアプリケーションで新しいスレッドを作成する最良の方法ですか?
カプリカノン

4
@kapricanon:はい、処理できない特定の要件がない限り、またはWebサーバーに既に同様のものがあります。
マイケルボルグ

2

あなたの質問に答えて:

JavaベースのWebアプリケーションとスタンドアロンJavaアプリケーションのマルチスレッド化の違い

違いはありません。通常、ソフトウェアWebアプリケーションは、新しいリクエストごとにスレッドを作成することにより、すでにいくつかのマルチスレッドを構築します。他のアプリケーションと同じようにスレッドを使用/作成できます。

実際、マルチスレッドを使用すると、適切に使用すればパフォーマンスが大幅に向上します。ネットワークアクセスやディスクドライブアクセスなどのI / O集約型タスクの場合、パフォーマンスの向上はほぼ常に保証されます。計算量の多いタスクの場合、サーバーのコアごとに1つのスレッドのルールに従う必要があります。たとえば、コアにi7プロセッサが搭載されている場合、計算タスクを実行するには7つのスレッドに固執する必要があります。

あなたの質問に答えて:

そうすることには利点があり、どのシナリオでそれを行う必要がありますか?

Michael Borgwartは、計算速度を向上させるためにこれを行うべきではないと言います。この記事では、ユーザーが計算量の多いタスクを実行する必要がある場合に、マルチスレッドが応答性を提供するのに役立つことを示唆しているため、私は同意しません。簡単な英語では、ユーザーはマルチスレッドで計算量の多いタスクを完了するまで待つ必要はありません。

スレッドを頻繁に使用する場合は、スレッドプールの使用をお勧めします。これにより、スレッド作成のオーバーヘッドが削減されます。


これは質問にどう答えますか?
gnat

1
回答はそれぞれのメリットに基づいている必要があります。コメントしたい場合は、最初に50レピュテーションポイントを獲得する必要があります。
ChrisF

1

これはいい質問です。Webアプリケーション開発に携わる開発者の多くは、明示的にマルチスレッドを使用していません。アプリケーションサーバーを使用してアプリケーションを展開しているため、その理由は明らかです。アプリケーションサーバーは、着信要求のスレッドプールを内部で管理します。

次に、なぜマルチスレッドを明示的に使用するのですか?Webアプリケーション開発者がマルチスレッドにさらされる必要があるのは何ですか?

多くのリクエストを同時にサーバーで処理する必要がある大規模なアプリケーションで作業する場合、特定の種類のリクエストが多くの処理を行ってアプリケーションのパフォーマンスを低下させる可能性があるため、すべての種類のリクエストを同時に処理することは困難です。

特定の種類の要求を処理した後、Webアプリケーションがユーザーに電子メールとSMSで通知する必要がある例を考えてみましょう。要求スレッドと同期して実行すると、Webアプリケーションのパフォーマンスが低下する可能性があります。そこで、マルチスレッドの役割があります。そのような場合、電子メールとSMSの送信のみを担当するスタンドアロンのマルチスレッドアプリケーションをネットワーク経由で開発することをお勧めします。


なぜこの答えがダウン投票されるのですか?
アヌラグシャルマ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.