0

我有一个任务,我必须创建一个进程的两个实例,而另一个进程必须在其中一个终止时终止。我只能在关闭创建的第一个进程时执行此操作,这是否意味着创建的进程具有某种层次结构,即使它们都是同一进程的子进程?

提前致谢。

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();
4

2 回答 2

3

这是否意味着创建的流程具有某种层次结构,

不,这只是您编写代码的方式。在第一个进程退出之前,您一直处于阻塞状态,不幸的是,如果第二个进程首先退出,您的代码将无法知道这一点。

由于 Java 没有为您提供“waitForEitherProcess”方法,我认为您需要进行轮询循环检查进程的状态。定期在每个进程上调用 exitValue,然后休眠几毫秒。如果 exitValue 返回一个 int,则该进程已终止。如果它抛出异常,它没有。使用它来决定哪个进程已经退出以及哪些需要被杀死。

于 2012-11-23T00:38:57.803 回答
2

Process#exitValueIllegalThreadStateException如果进程尚未退出,将抛出一个,你可以利用它。

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) {
    }
}
于 2012-11-23T00:46:56.900 回答