【问题标题】:How to kill several processes in java?如何杀死java中的几个进程?
【发布时间】:2018-06-28 17:20:48
【问题描述】:

我想创建一些进程,然后一个接一个地杀死(每次杀死前等待 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);
    }
}

【问题讨论】:

    标签: java process runtime kill


    【解决方案1】:

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

    @编辑

    只有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。

    可以这样,用户和你的App同时启动calc.exe。所以你得到了Calc.exe的两个进程,一个由你启动,一个由应用程序启动。

    【讨论】:

    • 我试过p1.destroyForcibly(); p2.destroyForcibly()...,但只有第一个被杀了。我希望他们一个一个被杀...我的Java是Java 8.2
    猜你喜欢
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 2018-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多