2

スレッドがソフトウェア/Web アプリケーションの重要なメンバーであることは知っています。しかし、Java EE テクノロジを使用したオンライン ショッピングに関する大学のプロジェクトでは、それらを使用しませんでした。

私のプロジェクトにそれらを適用した場合、どのように役立つか誰か教えてもらえますか?

私は通貨などに精通していますが、その重要性を理解するために全体像を知りたいだけです。たとえば、なぜわざわざコードをスレッドに入れなければならないのですか (複数のリクエストと私が気にする必要があるという事実は別として)。少し混乱しています。

4

5 に答える 5

3

Java EE プロジェクトを行ったことがある場合、スレッドはおそらく触れたことがないものです。Java EE を使用する場合、何らかのコンテナーにプラグインされる部分をコーディングしています。たとえば、EJB をコーディングすると、アプリケーション サーバーが EJB のキャッシュと呼び出しを処理します。永続エンティティをコーディングすると、アプリケーション サーバーが永続コンテキストを提供し、トランザクションを処理します... アプリケーション サーバーには、クライアントの要求を処理するためにプールされた多数のスレッドがあります。それらはすべてあなたのために管理されているので、実際に見ることはできません。フレームワークに対してコーディングしているためです。

Java SE に切り替えると、状況が異なります。アプリケーションをほとんどゼロから構築している場合、おそらくいくつかのライブラリを使用しているが、実際にはフレームワークを使用していない場合、重要なアプリケーションではマルチスレッドが必要になる可能性があります。可能な限り最良の方法で並行処理をいつ、どのように使用するかを知ることは、研究と経験を通じて学ぶものですが (「Java 並行処理の実践」という本は、ここでの頼りになる仕事のようなものです)、何かが必要なときはいつでも基本的に言うことができます。他の作業が実行されている間にバックグラウンドで実行される場合、またはプログラムが戻るための呼び出しを待たずに続行できる場合、マルチスレッドが機能する可能性があります。

于 2013-01-16T17:20:34.837 に答える
1

Java EEを使用していたので、それはすでにマルチスレッド環境であり、それがマルチスレッドの必要性を失わなかった理由です。

サーブレットに送信されるリクエストごとに、各リクエストがコンテナによって個別のスレッドで処理されることを知っておく必要があります。そのため、バックグラウンドでは、コンテナによって提供されるマルチスレッドを使用していました。

これから説明する例が実際のシナリオに関連しているかどうかはわかりませんが、理解するためだけのものです。

新年のことを言うと、あなたはあなたのショッピングウェブサイトで新年のオファーについてすべての登録ユーザーに電子メールを送る必要があります。したがって、データベースには数千またはそれ以上の顧客がいる可能性があります。したがって、ここでスレッドを使用して、1000人の顧客に対していくつかのチャンクで電子メールを送信するタスクを実行できます。それぞれが100人の顧客に電子メールを送信する10個のスレッドを使用できます。注:これは私の頭に浮かんだシナリオにすぎません。

于 2013-01-16T17:16:07.120 に答える
1

それは本当に文脈に依存します。Java を作成している場合は、サーバー上にいる可能性があります。その場合、アプリケーション サーバーは通常、スレッドを管理します。

クライアント側の Java コードは最近ではほとんど使用されなくなりましたが、まだ存在しています。たとえば、Swing のスレッドは、再描画/イベント スレッドが滞らないように、バックグラウンド タスクにとって重要です。

「いつスレッドを使用するか」よりも、スレッドセーフの概念を理解することの方がおそらく重要です。Joshua Bloch の『Effective Java』は、そのための優れた本です (または、私が読んだときは何年も前にそうでした)。

于 2013-01-16T17:19:47.763 に答える
0

なぜスレッドを使用するのですか?

(これは、使用するプラットフォーム スイートとは無関係であることに注意してください。)

パフォーマンス

想像してみてください。買い物に行くときに、かごにたくさんの物が入っていないとします。あなたの前に買い物に行く人が 10 人ほどいて、その多くは買い物かごにもっとたくさんの物を入れています。別のレーンを開くのとは対照的に、チェックアウトレーンが処理しなければならないほど多くのものを持っていない場合、処理に時間がかかります.

スレッドは、店舗のチェックアウト レーンに似ています。それらが多ければ多いほど、実行できる操作が増えます。

コンピューターがますます高速化するのをやめ、より多くのコアをチップに搭載することに重点が置かれるにつれて、ソフトウェア エンジニアとして、アルゴリズムとアプリケーションをハードウェアの使用に合わせてより効率的にする方法を考え出す必要があります。マルチスレッドは 1 つの方法です。大きな問題を取り、それを小さなサブ問題に分割して後で再結合するアルゴリズムを設計および実装できます。

なぜスレッドを使用しないのですか?

シングルコアシステム

スレッド化にはオーバーヘッドがあり、これは軽量プロセスのコンテキスト切り替えとスピンアップにあります。コアが 1 つしかない場合は、実際のデータを処理する代わりに、オーバーヘッドの処理により多くの時間を費やすことになります。

スレッドが多すぎるのは悪いことです

私はチェックアウト レーンのアナロジーを共有しました。より多くのレーンをオープンにすることは一般的には良いことですが、レーンをオープンにすることを正当化するのに十分な作業がない場合、それらはリソースとクロック サイクルを無駄にします。実行しなければならない作業量と必要なスレッド数のバランスを取ることが重要です。

于 2013-01-16T17:26:00.297 に答える
0

私はかつて、データのリストを処理するための要求 (HTTP ポストのみ) を受け取ったシステムを持っていました。データのビットごとに、別のシステムを呼び出して、応答を 1 ~ 6 秒待つ必要がありました。1000 ビットのデータを処理するには数十分かかります。HTTP 接続がタイムアウトします。そこで、同時実行を使用して、一度に 20 または 30 の要求をリモート システムに発行しました。とにかく、私のシステムはほとんど待っていました。これにより、総処理時間が以前の 3 ~ 5% に短縮され、全員が満足しました。

ここで、Java EE コンテナ内で Java SE の同時実行機能を使用することは合法ではないことに注意してください。コンテナはあらゆる種類のマルチスレッドを実行しており、マルチスレッドが干渉するか、干渉する可能性があります。ルールを破ったにもかかわらず、私たちが行っていたことは問題なく機能することがわかりました。他の状況では、私はそれを試してみましたが、うまくいかないことがわかりました.

WebSphere または Weblogic Java EE コンテナーを使用している場合、どちらもマルチスレッドを処理するための独自のフレームワークを備えています。それは同じもので、提案された標準でしたが、その名前は今日私にはわかりません.

Tomcat などのサーブレット コンテナーを使用している場合は、Java SE マルチスレッドを使用できます。

Spring Framework には、いくつかの同時実行のニーズに合わせてプログラムできるいくつかのユーティリティ クラスがあります。これらにより、Java SE から IBM および Oracle が使用するフレームワークにバッキング並行性を簡単に切り替えることができます。

于 2013-01-16T17:26:09.163 に答える