8

Java でのマルチスレッドの基本を「理解」したと思います。私が間違っていなければ、大きな仕事を引き受けて、それを複数の (同時の) タスクに分割する方法を考えます。次に、これらのタスクをRunnableまたはとして実装Callableし、それらすべてを に送信しますExecutorService。(というわけで、そもそもここまで間違っていたら、まず正してください!!!

run()第二に、内部に実装するコード、またはcall()ノンブロッキング アルゴリズムなどを使用して、可能な限り「並列化」する必要があると想像する必要があります。そして、これが難しい部分です (並列コードを記述する)。正しい?正しくありません?

しかし、私がまだJavaの同時実行性(および一般的に同時実行性を推測している)で抱えている本当の問題、およびこの質問の真の主題は次のとおりです。

そもそもマルチスレッドが適切なのはいつですか?

スタック オーバーフローに関する別の質問の例を見ました。投稿者は、巨大なテキスト ファイル (Moby Dick という本) を読み取って処理するために複数のスレッドを作成することを提案しまし。考え。これについての彼らの理由は、すでに遅いプロセス (ディスク アクセス)に加えて、コンテキスト切り替えのオーバーヘッドを導入する複数のスレッドがあるためです。

マルチスレッドに適した問題のクラスは何か、常にシリアル化する必要がある問題のクラスは何か? 前もって感謝します!

4

7 に答える 7

8

マルチスレッドには、IMO という 2 つの主な利点があります。

  • 集中的な作業を複数の CPU/コアに分散できます。4 つの CPU のうち 3 つをアイドル状態にして単一の CPU ですべてを実行する代わりに、問題を 4 つの部分に分割し、各 CPU を独自の部分で動作させます。これにより、CPU を集中的に使用するタスクの実行にかかる時間が短縮され、マルチ CPU ハードウェアに費やした費用が正当化されます。
  • 多くのタスクの待ち時間を短縮します。4 人のユーザーが Web サーバーにリクエストを送信し、そのリクエストがすべて 1 つのスレッドによって処理されるとします。最初のリクエストが非常に長いデータベース クエリを作成するとします。スレッドはアイドル状態で、クエリが完了するのを待っています。他の 3 人のユーザーは、この要求が完了するまで待機して小さな Web ページを取得します。スレッドが 4 つあれば、CPU が 1 つでも、データベース サーバーが長いデータベース クエリを実行している間に、2 番目、3 番目、4 番目の要求を処理でき、すべてのユーザーが満足します。そのため、ブロック IO 呼び出しがある場合、マルチスレッドは特に重要です。これらのブロック IO 呼び出しは、他の待機中のタスクを実行する代わりに、CPU をアイドル状態にするためです。

注: 複数のスレッドから同じディスクから読み取る際の問題は、長いファイル全体を順番に読み取るのではなく、コンテキスト スイッチごとにディスクのさまざまな物理的な場所を強制的に切り替えることです。すべてのスレッドはディスクの読み取りが完了するのを待っている (IO バウンド) ため、単一のスレッドがすべてを読み取る場合よりも読み取りが遅くなります。しかし、データがメモリに格納されたら、スレッド間で作業を分割することは理にかなっています。

于 2012-06-29T17:59:25.687 に答える
5

マルチスレッドに適した問題のクラスは何か、常にシリアル化する必要がある問題のクラスは何か?

基本的に、CPU を集中的に使用するタスク (メモリ内の並べ替えなどの大量のデータ処理を行うタスク) は並列化する必要があり (可能であれば)、I/O バウンドのタスクはシーケンシャルのままにする必要があります (ディスク I/O など)。もちろん、これはいくつかの例外を除いた一般的なアドバイスです。

于 2012-06-29T17:44:27.663 に答える
3

マルチスレッドは、次の場合に役立ちます。

  • 複数の CPU または複数のコアに作業を分散します。
  • 時間のかかるタスク (ファイルのロード、計算の実行など) を実行している間も応答性を維持します。
  • ブロックする可能性のある操作 (ソケットからの読み取りなど) を実行している間も応答性を維持します。
于 2012-06-29T17:52:59.150 に答える
3

マルチスレッドに適した問題のクラスは何か、常にシリアル化する必要がある問題のクラスは何か?

Swing コンポーネントを使用して GUI を構築している場合、(例として) ボタンをクリックして実行したいタスクに時間がかかりすぎて、タスクの実行中に GUI がロックされることがあります。

したがって、タスクを別のスレッドで実行することで、GUI スレッド (Swing ワーカー スレッド) を Swing コンポーネントに応答させておくことができます。

于 2012-06-29T17:48:50.963 に答える
1

私はこっちの方が好きです……。

  1. GUI ベースのアプリケーションの場合、スレッド化は非常に重要です。

  2. Java では、GUI は Event Dispatcher Thread によって処理されます。UI スレッドで UI 作業を維持し、非 UI スレッドで非 UI 作業を維持することを常にお勧めします。 ボタンを押すと、Web サーバーに http 要求が送信され、サーバーで処理が行われ、結果が返されたとします。このジョブを処理する非 UI スレッドを作成しない場合、GUI はWebサーバーの応答が受信されるまで、および受信されない限り、NON-RESPONSIVEになります。

  3. スレッドは、複数の作業を同時に行う場合にも非常に重要です。 最良の例はOSです。通常、私はお気に入りの音楽を聴きながらコーディングを行い、同時にネットサーフィンなどを行っています....マルチスレッドが非常に便利な場所です.スレッドが1つしかなかったら、私たちができることを想像もしなかったでしょう.今日はOSでやってください。

  4. CPU を集中的に使用する作業の並列処理には、CPUを横断する複数のスレッドが使用されます。

  5. Java Servletの場合、サーバーに到達するすべてのリクエストは、コンテナーによって提供される個別のスレッドによって処理されます。

于 2012-06-29T18:03:58.353 に答える
0

並行性は、特定のアルゴリズムでも非常に役立ちます。たとえば、私は現在、遺伝的アルゴリズムを使用して複雑な問題の最適な解を計算するプログラムの作成に取り組んでいます。遺伝的アルゴリズムでは、すべての人が適応度関数を実行する必要がある個人の集団があります。これらのフィットネステストの実行は、通常、互いに完全に独立しており、実行するテストが多数あります(たとえば、人口が数百に達する可能性があります)。並列化は、すべての適応度関数の実行にかかる時間を短縮することにより、遺伝的アルゴリズムの速度を劇的に向上させることができます。

うまくいけば、これにより、特にすべてのCPU集約型タスクが簡単に並列化されるわけではないため、人々が「CPU集約型」タスクについて話すときに何を参照しているのかがわかります。

于 2012-06-29T18:25:40.890 に答える
0

ボックスのスレッドの 99.9% は、CPU を集中的に使用する作業を行っていません。ここにある私のボックスには、現時点で 1084 のスレッドがあり、CPU 使用率は 1% です。1084 のスレッドは、重要なことをまったく行っていません。それらはすべて待機中であり、多くは他のスレッドからのシグナルを待っていますが、最も重要なのは、多くが I/O を待機していることです。プリエンプティブ マルチタスク OS で複数のスレッドを使用する最も重要かつ一般的な理由は、アプリの全体的な I/O パフォーマンスを向上させることです。これらのプリエンプティブ カーネルは、同期、キュー、ロックなどの苦痛に私たちを追い込みます。つまり、ある命令が必ずしも別の命令に続くとは限らない、本質的に異なる設計ゾーンです。利点は、非常に大きなものですが、I/O のドライバーを待機しているスレッドを「すぐに」準備/実行できるため、I/O パフォーマンスが協調スケジューリング システムよりも大幅に優れていることです。ハードウェア割り込みに応答するドライバーによる I/O 完了時。非同期 I/O はこれを変更しません。I/O 待機をカーネル スレッド プールに移動するだけで、非同期要求をリストし、I/O が発生したときにコールバック設定ユーザー スレッドを準備する必要があります (ユーザー コードを強制しながら)。明示的なステートマシンに戻す)。したがって、「マルチスレッドに適した問題のクラスはどれか」:

1) 複数のソースからの I/O が予期され、完了が非同期で発生する可能性がある場所。

2) スレッドによって、アプリの設計がより簡単、迅速、安全になります。20 の「こと」が同時に発生する必要がある場合、20 の異なるコンテキストを処理するステートマシンを自分で開発するよりも、明らかに「インライン」コードを記述して 20 のスレッドで実行する方がはるかに簡単です。プロセス内のスレッドはメモリを共有するため、キューで巨大なバッファー (OK、バッファー参照/ポインター) を通信するのは簡単です。通信スタック。

3) マルチコア ボックスでの CPU を集中的に使用する操作。特に、キャッシュの最適化のために各スレッド/コアのデータセットを分離できる場合。

4) AOB :)

複数のスレッドとプリエンプティブ カーネルからの I/O パフォーマンスがなければ、BitTorrent も、ビデオ ストリーミングも、MMP ゲームも、AVI プレーヤーもありません。

ただし、メモ帳と MS Word を実行することはできます...

于 2012-06-30T00:32:12.533 に答える