我有一个分配,我必须创建一个进程的两个实例,另一个进程必须在其中一个进程终止时终止。我只能在关闭创建的第一个进程时执行此操作,这是否意味着创建的进程具有某种层次结构,即使它们都是同一进程的子进程?
提前致谢。
ProcessBuilder pb = new ProcessBuilder(args);
Process proc_1 = pb.start();
Process proc_2 = pb.start();
System.out.println("Child is running...wait for child to terminate");
int exitValue_1 = proc_1.waitFor();
System.out.println("Child_1 finished with exit value -> " + exitValue_1);
if(exitValue_1==0) proc_2.destroy();
int exitValue_2 = proc_2.waitFor();
System.out.println("Child_1 finished with exit value -> " + exitValue_2);
if(exitValue_2==0) proc_1.destroy();
答案 0 :(得分:3)
这是否意味着创建的进程具有某种层次结构,
没有。这就是你编写代码的方式。你阻塞,直到第一个进程退出,不幸的是,如果第二个进程首先退出,你的代码无法知道这一点。
由于Java没有为您提供“waitForEitherProcess”方法,我认为您需要执行轮询循环来检查进程的状态。在每个进程上定期调用exitValue,然后休眠几毫秒。如果exitValue返回int,则进程已终止。如果它抛出异常则没有。使用它来决定退出哪个进程以及哪个进程需要被杀死。
答案 1 :(得分:2)
Process#exitValue
将抛出IllegalThreadStateException
,您可以利用此功能。
ProcessBuilder pb = new ProcessBuilder(args);
Process proc_1 = pb.start();
Process proc_2 = pb.start();
boolean running = true;
while (running) {
try {
int exitValue = proc_1.exitValue();
System.out.println("Child_1 finished with exit value -> " + exitValue);
if(exitValue==0) {
proc_2.destroy();
running = false;
break;
}
} catch (IllegalThreadStateException exp) {
}
try {
int exitValue = proc_2.exitValue();
System.out.println("Child_2 finished with exit value -> " + exitValue);
if(exitValue==0) {
proc_1.destroy();
running = false;
break;
}
} catch (IllegalThreadStateException exp) {
}
}