0

バッチファイルを実行する次のJavaコードスニペットがあります(フラグに応じてファイルの名前を変更します)。このコードは正しく動作します。しかし、その行while( isRunning(p) ) {}にコメントを付けると、機能しません。誰でもその理由を教えてもらえますか?

public static void main(String[] args) throws IOException, InterruptedException {
        ProcessBuilder pb = new ProcessBuilder(  fileManipulatorScriptLocation, "Rename_File", "a.txt", "b.txt" );
        pb.directory( new File(targetDirectory) );
        Process p = pb.start();
        while( isRunning(p) ) {}
    }

    public static boolean isRunning(Process process) {
        try {
            process.exitValue();
            return false;
        } catch (IllegalThreadStateException e) {
            return true;
        }
    }
4

2 に答える 2

4

ビジー待機無限ループの代わりに、 を使用しますProcess#waitFor。機能しない理由: 親プロセス (Java) がすぐに終了し、子プロセスがドラッグされます。

于 2013-01-16T21:40:23.880 に答える
0

isRunning()をチェックしProcess#exitValue()ます。

javadocから:

サブプロセスの終了値を返します。

戻り値: この Process オブジェクトによって表されるサブプロセスの終了値。慣例により、値 0 は正常終了を示します。

例外: IllegalThreadStateException - この Process オブジェクトが表すサブプロセスがまだ終了していない場合。

つまり、プロセスがまだ実行されている場合はメソッドIllegalThreadStateException内でスローされisRunning()ますが、exceptin がキャッチされるため、メソッド return true、そうでない場合exitValue()はプロセスが存在する値とisRunningメソッド returnを返し、ループfalseを中断します。while

于 2013-01-16T21:45:54.130 に答える