如何在Java中杀死多个进程?

时间:2018-06-28 17:20:48

标签: java process runtime kill

我想创建一些进程,然后一个接一个地杀死(每次杀死之前等待2秒)。结果,应出现3个窗口,然后依次消失。问题是只有第一个进程被杀死。

 public static void main(String[] args) {
    try {
        Process p1 = Runtime.getRuntime().exec("notepad.exe");
        Process p2 = Runtime.getRuntime().exec("calc.exe");
        Process p3 = Runtime.getRuntime().exec(new String[]{"cmd.exe", "/c", "start", "dir"});
        Thread.sleep(2000);
        // p1.waitFor(2, TimeUnit.SECONDS);
        p1.destroy();
        Thread.sleep(2000);
        //  p2.waitFor(2, TimeUnit.SECONDS);
        p2.destroy();
        Thread.sleep(2000);
        //  p3.waitFor(2, TimeUnit.SECONDS);
        p3.destroy();
    } catch (Exception ex) {
        System.out.println("" + ex);
    }
}

1 个答案:

答案 0 :(得分:1)

如果使用 Java 9 ,则可以使用ProcessHandledestroyForcibibly()方法,该方法与kill -9几乎相同,但是由于 Java 8 您可以在destroyForcibly()对象上使用Process

@编辑

这仅与calc.exe和cmd.exe有关,因此让我们看一下calc.exe进程。

运行calc.exe时,calc.exe启动C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.1804.911.0_x64__8wekyb3d8bbwe

因此这些过程是不同的。Calc.exe使用其他PID启动另一个过程。

该怎么办?

Java 9 上,您可以使用ProcessHandle类来查找从该目录运行的进程,获取PID并终止:

我得到: Optional[C:\Program Files\WindowsApps\Microsoft.WindowsCalculator_10.1804.911.0_x64__8wekyb3d8bbwe\Calculator.exe]

要获取我们的进程,您可以在启动calc.exe之前获取进程的快照,并在运行calc.exe之后与该快照进行比较。但这不能100%保证您仅获得一个Calculator.exe。

就像这样,用户和您的应用同时启动calc.exe。因此,您得到两个Calc.exe进程,一个由您启动,一个由应用程序启动。