私はこの SSCCE を試してきましたProcess
。ProcessBuilder
import java.io.IOException;
public class TestProcess {
public static void main(String[] args) {
Process process = null;
ProcessBuilder pb = new ProcessBuilder("notepad.exe");
try {
process = pb.start();
} catch (IOException e) {e.printStackTrace();}
//have some time to close notepad
try {
Thread.sleep(10*1000);
} catch (InterruptedException ignored) {}
try {
System.out.println(process.exitValue());
} catch (IllegalThreadStateException e) {
System.out.println(e);
}
if (process != null)
process.destroy();
/*try {
Thread.sleep(0, 1);
} catch (InterruptedException ignored) {}*/
System.out.println(process.exitValue());
}
}
- このコードを実行して、10 秒のタイムアウト前にメモ帳を閉じると、
destroy()
呼び出しは、既に終了したプロセスを停止しようとしても問題を示しません。なんで? - このコードを実行し、メモ帳をまったく閉じない場合 (コメント付きの 2 回目のスリープ)
destroy は非同期呼び出し (シグナルを送信するだけですか? ) のようで、2 番目に例外が発生します。exitValue()
java.lang.IllegalThreadStateException: process has not exited
Exception in thread "main" java.lang.IllegalThreadStateException: process has not exited
at java.lang.ProcessImpl.exitValue(ProcessImpl.java:246)
at TestProcess.main(TestProcess.java:30)
- このコードを実行し、メモ帳をまったく閉じない場合 (コメントなしの 2 回目のスリープ)
exitValue
、スリープ値が 1ms であっても、2 回目は決して例外をスローしません。オーバーヘッド自体が原因ですか?sleep()
2 番目exitValue
は 1 を返します。
PS。Windows 7 と Eclipse から実行します。