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番目のスクリプトを実行しています。これ?私はどんなアイデアでも嬉しいです。
現在の実行スレッドは、プロセスが終了する(つまり、実行が終了する)までprocess.waitFor()
でブロックされます。ソース ここ
また、プロセスがすでに終了している場合は、waitFor()はブロックされないことに注意してください。質問に入力したコードが実際に実行したものかどうかはわかりませんが、スクリプトを実行するたびにProcessの新しいインスタンスを再作成する必要があります(つまり、startを複数回呼び出すだけではありません)同じプロセス:最初の実行後は機能しません)
また、「コマンド」に出力がある場合。 stream(process.getErrorStream())
およびprocess.getInputStream())
による標準出力と標準エラー出力を読み取る必要があります。そうでない場合、出力またはエラー出力がいっぱいになると、waitfor()
がハングします。
プロセスが完了するまで待機します。回避策:
1 isAlive()を使用する
2 waitFor(long timeout、TimeUnit unit)を使用(1.8のみ)