web-dev-qa-db-ja.com

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

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

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

13
kapricanon

Webアプリケーションの場合、Webコンテナーがマルチスレッドを処理するということは正しいですか?

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

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

もしそうなら、Webベースのアプリケーションに新しい踏み板を導入できますか?

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

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

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

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

20

あなたの質問に答えて:

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

違いはありません。通常、その上に構築されているソフトウェアWebアプリケーションは、新しい各要求をスレッドにすることにより、すでにマルチスレッドを提供します。他のアプリケーションと同じようにスレッドを使用/作成できます。

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

あなたの質問に答えて:

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

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

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

2
SyntaxRules

これはいい質問です。Webアプリケーション開発に携わるほとんどの開発者は、マルチスレッドを明示的に使用していません。アプリケーションサーバーを使用してアプリケーションをデプロイしているので、その理由は非常に明白です。アプリケーションサーバーは、着信要求のスレッドプールを内部的に管理します。

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

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

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

1
Anurag Sharma