1

Java をフロント エンドとして使用し、シェルをバック エンドとして使用する Web アプリケーションを開発しています。シェルで大量のファイルを処理しています..たとえば、100個のファイルを処理する必要がある場合。Java アプリケーションから 4 つのサブプロセスを生成する予定です。プロセス Builder について読みました。しかし、 start() メソッドを使用して複数のプロセスを生成し、それが完了するまでそれらすべてを待ち、再び処理を続行する方法について明確なアイデアを得ていません。これに関するアイデアは、私にとって非常に役立ちます。ありがとうございました。

4

1 に答える 1

2

一般的に言えば、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     

}
于 2012-07-22T23:29:23.600 に答える