7

Java はマルチスレッドを適切にサポートし、Java は Process、ProcessBuilder、および Runtime.exec() を介してマルチプロセスもサポートしています...

スレッドとプロセスの定義と、OS の概念におけるそれらの違いを明確に知っています。

しかし、Java アプリケーションでマルチスレッドの代わりにマルチプロセスを使用する必要があるのは、なぜ、どのような状況でしょうか?

4

6 に答える 6

8

頭の上で、processesの補完として使用する理由threadsは次のとおりです。

  • 堅牢性、失敗したプロセスが別のプロセスに影響を与えない
  • 分離。複数の JVM を起動すると、干渉を気にせずに同じクラスを実行できます (たとえば、非スレッド セーフ ライブラリをより簡単に使用できます)。
  • 通常、外部コマンドを起動できるようにする (例: 非 Java)
  • スレッド アフィニティ。一部の OSでは、スレッドではなく複数の CPU で共有されるプロセスを使用して、特にスレッド共有ワーキング セットを検討する場合に、より優れたキャッシュ セマンティクスを提供する場合があります。

それでも、ほとんどのアプリケーションthreadingでは、メモリ上の理由、スポーンの容易さ、および (比較的) シンプルな使いやすさから好まれるツールです。

于 2012-09-17T06:58:13.890 に答える
8

プロセスを必ずしもスレッドの代わりと考えないでください。Java のプロセスは、外部コマンドを実行する便利な方法です。これらは、開始と同期が面倒なため、一般的な並列処理のシナリオではあまり役に立ちません。

それらのもう 1 つの適切な使用法は、スタック オーバーフローが終了したり原因になったりしない可能性があるネイティブ コード (または制御できないその他のコード) を分離することです。これがスレッド内で実行されると、プロセス全体がダウンする可能性があります。代わりに、新しいプロセスを生成してから、あまり気にせずに強制的に終了させることができます。

于 2012-09-17T06:59:14.150 に答える
1

JVM にはランナウェイ保護はありません。

停止しないスレッドがある場合、それを強制的に停止する唯一の方法は、オペレーティング システムにその JVM を強制終了させることです。個別のプロセスを持つことで、アプリケーションの残りの部分を実行し続けることができます。

于 2012-09-17T07:00:51.377 に答える
1

同期が問題にならない場合、つまりプロセスが同じデータに干渉しない場合に必要になることがありますが、これらのプロセスの出力を同時に収集する必要があります。つまり、完全に異なるプロセスを並行して実行する必要があります。プロセス。

于 2012-09-17T06:56:12.733 に答える
1

状況によりますが、簡単な答えはありません。OS/JVM に応じて、スレッドとプロセスは異なる意味を持ち、異なるレベルの分離を持つ可能性があります。

なぜ両方を使用する能力があるのですか?? ここに例があります

スレッド セーフではない (または保証がない) レガシまたはサードパーティのネイティブ (C++) ライブラリを使用する必要があるシナリオを考えてみましょう。多数のプロセッサを利用するためにサーバーを合理化する必要があると思います。マルチプロセス アーキテクチャの方が適しています。

隔離

  • マルチスレッドを使用しようとすると、同期、デッドロック、アクティブロックなどの問題が発生するリスクがあります。
  • マルチプロセス アーキテクチャを使用する場合は、メモリ アクセスに関してある程度の分離が保証されます。あなたはできるだろう

エラー処理

  • これらのマルチプロセス コンポーネントの 1 つが失敗した場合、開始プロセスで JVM 全体をダウンさせるのではなく、回復して別のプロセスで補うことができる可能性が高くなります。それを処理して保護する方法はありますが、分離されたプロセスにラップすると、作業が楽になります。 不適切に記述された古代エイリアンのネイティブ ライブラリに対して防御的にコーディングする必要があった場合は? あなたは私が何を意味するか知っているでしょう。
于 2016-07-07T18:03:45.233 に答える
0

JVM 用ではないが、o/s コマンド ラインを使用して実行できるプログラムを実行する必要がある場合、それをスレッドとして実行することはできず、プロセスとしてのみ実行します。

于 2012-09-17T08:38:57.317 に答える