web-dev-qa-db-ja.com

ProcessBuilderおよびProcess.waitFor()、istはどのくらい待機しますか?

ProcessBuilder クラスと Process クラスを使用して、Javaから.exeファイルを実行しています。私がやっていることを説明するには:

 builder = new ProcessBuilder(commands);
 builder.redirectErrorStream(true);
 Process process = builder.start();
 process.waitFor();

「waitFor()」がどれだけ待機しているか知りたいのですが。それは私の.exeが実行されるまで待機していますか、それともその実行が完了するまで待機していますか?

私の.exeは、コンパイルされたAutoItスクリプトです。つまり、マウスの動きのような相互作用があり、時間がかかる可能性があります。したがって、.exeを呼び出した後にJavaコードの実行が続行されるのか、それとも本当にそれを待っているのかを知る必要があります。

私が達成したいのは、2つのスクリプトの回転実行ですが、恐らく、私のJavaコードは、最初のスクリプトがまだ実行されている間に2番目のスクリプトを実行しています。これ?私はどんなアイデアでも嬉しいです。

11
KJaeg

現在の実行スレッドは、プロセスが終了する(つまり、実行が終了する)までprocess.waitFor()でブロックされます。ソース ここ

また、プロセスがすでに終了している場合は、waitFor()はブロックされないことに注意してください。質問に入力したコードが実際に実行したものかどうかはわかりませんが、スクリプトを実行するたびにProcessの新しいインスタンスを再作成する必要があります(つまり、startを複数回呼び出すだけではありません)同じプロセス:最初の実行後は機能しません)

8
ben75

また、「コマンド」に出力がある場合。 stream(process.getErrorStream())およびprocess.getInputStream())による標準出力と標準エラー出力を読み取る必要があります。そうでない場合、出力またはエラー出力がいっぱいになると、waitfor()がハングします。

3
Dorleeze

プロセスが完了するまで待機します。回避策:

1 isAlive()を使用する

2 waitFor(long timeout、TimeUnit unit)を使用(1.8のみ)

2