Java をフロント エンドとして使用し、シェルをバック エンドとして使用する Web アプリケーションを開発しています。シェルで大量のファイルを処理しています..たとえば、100個のファイルを処理する必要がある場合。Java アプリケーションから 4 つのサブプロセスを生成する予定です。プロセス Builder について読みました。しかし、 start() メソッドを使用して複数のプロセスを生成し、それが完了するまでそれらすべてを待ち、再び処理を続行する方法について明確なアイデアを得ていません。これに関するアイデアは、私にとって非常に役立ちます。ありがとうございました。
1 に答える
一般的に言えば、startはRuntime.exec(...)
あなたに代わって呼び出します。
実行すると(それ自体の小さなプロセスでオフになります)、プロセスの入力ストリームと出力ストリームを介してそれと対話できます。
私自身の仕事では、入力ストリームとエラーストリームを監視しています。これを行うには、ストリームごとに新しいスレッドを生成し、メソッドを介してスループットを監視しstream.read()
、戻り結果-1を探して、ストリームがいつ完了したかを判断します。
「waitFor」機能を提供し、ストリームスレッドのクリーンアップを支援するために使用される3番目の「モニター」スレッドを使用します。
少なくとも、別々のスレッドで入力ストリームとエラーストリームを読み取ることをお勧めします。これにより、現在のスレッドコンテキストをブロックすることなく、プロセスを監視できます。
プロセスが終了するのを待ちたい場合は、を使用する必要がありますProcess.waitFor()
(プロセスはProcessBuilder.start()
メソッドによって返されます)。これにより、プロセスが終了するのを待ちます。このメソッドは、プロセスの終了コードを返します。これは、プロセスが通知する可能性のあるエラーに応答するのに役立ちます。
さて、要するに...
ProcessBuilder pb = new ProcessBuilder(new String[] {cmd, parameter1, parameter2, ...});
Process process = pb.start();
InputStream is = process.getInputStream();
InputStream isErr process.getErrorStream();
// Spawn some threads to process the streams
int exitValue = process.waitFor();
if (exitValue == 0) {
System.out.println("All is good with the world");
} else {
// Handle error
}