同时杀死这两个进程

时间:2012-11-23 00:20:28

标签: java process

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

提前致谢。

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

2 个答案:

答案 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) {
    }
}