すべてを同時に実行したいタスクが3つある場合、現在考えている方法は2つあります。
Linuxでプログラムを実行しているので、シェルスクリプトで実行できます。
java Task1 & java Task2 & java Task3 &
または、1つのJavaプログラムを使用して、タスクを実行するために3つの子スレッドを生成することもできます。
どちらの方法がより効率的か知りたいです。シェルの方法で複数のJVMインスタンスが作成されるとは思えませんか?
すべてを同時に実行したいタスクが3つある場合、現在考えている方法は2つあります。
Linuxでプログラムを実行しているので、シェルスクリプトで実行できます。
java Task1 & java Task2 & java Task3 &
または、1つのJavaプログラムを使用して、タスクを実行するために3つの子スレッドを生成することもできます。
どちらの方法がより効率的か知りたいです。シェルの方法で複数のJVMインスタンスが作成されるとは思えませんか?
これをJavaで実行し、プログラムをマルチスレッドにして、3つのスレッドを使用する方が効率的です。はい、シェルウェイは3つのJVMインスタンスを作成します。
しかし、問題は、なぜ一方の代替案を他方よりも検討する必要があるのかということです。とにかくこれが小さなタスクにすぎない場合は、個人的には、シェルで3つのインスタンスを開始するだけです。
タスクが長時間実行される場合、3つのJVMのオーバーヘッドはごくわずかです。
長い間、私はタスクごとに30秒アップを参照します。では、短時間のタスクはどうですか?ここで、時間効率は、タスクが非常に頻繁に繰り返される場合にのみ重要です。繰り返し実行すると、JVMを(再)ロードするオーバーヘッドがはるかに小さくなりますが、常にいくらか残っています。
評決:シェルスクリプトを使用すると、実装がはるかに簡単になり、記述および保守するコードが少なくなり、さらに多くのコードを記述しなくても構成がはるかに容易になります。また、実行時に、一般的なシナリオでは、2つのアプローチの間に大きな違いは見られません。
どちらの方法がより効率的か知りたいです。
プロセッサの効率を決定するための基準を制限するだけの場合、Javaスレッドのアプローチの方が効率的である可能性が高くなります。JVMの起動とメモリ使用率の観点から、追加のJVMを実行するオーバーヘッドはかなりのものになります。
マルチスレッドバージョンが遅くなる可能性がある唯一のシナリオには、一部のリソースのタスク間の競合、またはJVMチューニングオプションの不適切な選択が含まれます。たとえば、ヒープを小さくしすぎる場合。
ただし、純粋にプロセッサの効率を理由に決定するのは賢明ではないと思います。
タスクが長時間実行されていて、3つのJVMに十分なメモリがある場合、パフォーマンスの違い(パーセンテージで)は重要ではない可能性があります。(実行全体に10時間かかる場合、JVMの起動に10秒長くかかるかどうかは誰が気にしますか?)
また、開発時間、テスト、およびメンテナンスについても考慮する必要があります。堅牢なマルチスレッドアプリケーションを作成する際の潜在的な複雑さを考慮に入れる必要があります。(そして、システムの機能要件と非機能要件の詳細がなければ、それを予測することはできません。)
要約すると、問題の詳細などがなければ、明確な答えはありません。
シェルの方法で複数のJVMインスタンスが作成されるとは思えませんか?
間違い。複数のJVMインスタンスを作成します。
これで、3つの個別のJVMインスタンスが起動され、それぞれが1つのタスク専用になります。1つのJVMで3つのタスクすべてを同時に実行する場合は、それらのタスクのスレッドオブジェクトを作成する必要があります。
したがって、これらのタスクをそれぞれ独自のスレッドで起動する非常に単純なJavaプログラムを1つ作成します。次に、そのプログラムを.jarファイルに変換し、実行をスケジュールします。
JVMが多いほど、CPU時間も長くなります。1つのJVMに3つのスレッドがある方が良いでしょう。しかし、簡単なベンチマークテストを行う価値があります。もしそうなら、それを私たちと共有してください。