3

Bat ファイルを実行し、成功コード 0 で終了するはずの Java プログラムがあります。

コードは基本的に次のようになります

Runtime.exec(....);

System.exit(0);

99.8% の確率で、これは完全に機能します。しかし、非常に散発的に、bat ファイルが実行されません。

私の理論では、特定のシステムでは、Runtime.exec は System.exit が実行される前に生成を終了できないというものです。これは可能性がありますか?

Runtime.exec のソースを見ましたが、興味深いことを行うためにネイティブ コードに落とし込まれています。

編集

これまでの回答に基づいて、.bat ファイルは javaw. 最初の Java プロセスの終了が、bat ファイルで実行された 2 番目のプロセスを強制終了しないことを確認できます。

問題が発生したときに、System.exit が発生する前に、bat ファイルが 2 番目の Java プロセスを生成していなかった可能性はありますか? 結局、Runtime.exec の問題ではないのでしょうか?

EDIT2

2 番目のプロセスが終了するのが待ちきれません。無期限に実行される可能性があり、1 番目のプロセスを終了する必要があります。

4

5 に答える 5

2

ProcessBuilderに変更してみてください。多分それはより良く機能します。

于 2012-05-11T19:00:34.473 に答える
1

親で終了する子プロセスを作成しています。Process.waitForJava プロセスがバット プロセスの終了を待機するようにするには、Java で使用する必要があります。

于 2012-05-11T19:07:02.190 に答える
0

System.exit(0)はjvmインスタンスを強制終了します。すべてのプロセスが終了します。System.exit(0)を実際に実行する場合は、System.exitを呼び出す前にexecプロセスが完了していることを確認してください。

于 2012-05-11T19:03:40.153 に答える
0

Process.waitFor()を使用します。このメソッドの戻り値の型は int であり、ランタイムを使用して現在のソリューションに従って戻りコードを提供します。
waitFor() は、必要に応じて、この Process オブジェクトによって表されるプロセスが終了するまで、現在のスレッドを待機させます。

于 2012-05-11T19:39:30.620 に答える
0

に変更します

Runtime.getRuntime().exec(....).waitFor();

System.exit(0);

しかし、これはバッチファイルの実行が完了するのを待ち、あなたの場合は javaw インスタンスの完了を待ちます。

于 2012-05-11T20:07:14.513 に答える