0

我有一个创建子进程的 Java Swing 应用程序。主 Swing 应用程序有一个停止按钮,当按下该按钮时应立即终止子进程。“process.destroy()”没有用。

Process myProcess = new ProcessBuilder("java", "-classpath", System.getProperty("java.class.path"), "MyClass.java");
try {
    myProcess.waitFor();
} 
catch (Exception e) {
    e1.printStackTrace();
}

...

myStopButton.addActionListener(new ActionListener() {

    @Override
    public void actionPerformed(ActionEvent e) {
        myProcess.destroyForcibly(); 
        // myProcess is a really long and complex process. So I could not destroy that using process.destroyForcibly().
    }
}
  1. 我可以向子进程发送一些信号以在内部调用 System.exit() 吗?
  2. 我可以使用“taskkill”只杀死子进程吗?
4

1 回答 1

4

这真的取决于你的java版本。

在 Java 8 之前

public abstract void destroy()

杀死子进程。此 Process 对象所代表的子进程被强制终止。

爪哇 8

public abstract void destroy()

杀死子进程。此 Process 对象表示的子进程是否被强制终止取决于实现。

public Process destroyForcibly()

杀死子进程。此 Process 对象所代表的子进程被强制终止。此方法的默认实现调用destroy(),因此可能不会强制终止进程。强烈鼓励此类的具体实现使用兼容的实现覆盖此方法。对 ProcessBuilder.start() 和 Runtime.exec(java.lang.String) 返回的 Process 对象调用此方法将强制终止该进程。

注意:子进程可能不会立即终止。即 isAlive() 可能会在destroyForcibly() 被调用后的短时间内返回true。如果需要,此方法可以链接到 waitFor()。

返回: 表示要被强制销毁的子进程的 Process 对象。

爪哇 9

public abstract void destroy​()

杀死进程。此 Process 对象表示的进程是否正常终止取决于实现。强制进程破坏被定义为进程的立即终止,而正常终止允许进程干净地关闭。如果进程不存在,则不采取任何行动。当进程终止时,来自 onExit() 的 CompletableFuture 完成。

public Process destroyForcibly​()

强行杀死进程。此 Process 对象所代表的进程被强制终止。强制进程破坏被定义为进程的立即终止,而正常终止允许进程干净地关闭。如果进程不存在,则不采取任何行动。当进程终止时,来自 onExit() 的 CompletableFuture 完成。

对 ProcessBuilder.start() 和 Runtime.exec(java.lang.String) 返回的 Process 对象调用此方法会强制终止该进程。

API 注释:

该过程可能不会立即终止。即 isAlive() 可能会在destroyForcibly() 被调用后的短时间内返回true。如果需要,此方法可以链接到 waitFor()。实现要求:该方法的默认实现调用destroy(),因此可能不会强制终止进程。实现说明:强烈建议此类的具体实现使用兼容的实现覆盖此方法。

回报:

表示进程被强制销毁的 Process 对象

于 2018-08-30T06:34:03.983 回答