这个问题在这里已有答案:
我有一个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().
}
}
这真的取决于你的java版本。
在Java 8之前
public abstract void destroy()
杀死子进程。此Process对象表示的子进程被强制终止。
Java 8
public abstract void destroy()
杀死子进程。此Process对象表示的子进程是否被强制终止是依赖于实现的。
public Process destroyForcibly()
杀死子进程。此Process对象表示的子进程被强制终止。此方法的默认实现调用destroy(),因此可能不会强制终止进程。强烈建议使用此类的具体实现来使用兼容的实现来覆盖此方法。在ProcessBuilder.start()和Runtime.exec(java.lang.String)返回的Process对象上调用此方法将强制终止该进程。
注意:子进程可能不会立即终止。 ieAlive()可以在调用destroyForcibly()后的短暂时间内返回true。如果需要,可以将此方法链接到waitFor()。
返回:表示要强制销毁的子进程的Process对象。
Java 9
public abstract void destroy()
杀死这个过程。此Process对象表示的进程是否正常终止是依赖于实现的。强制进程销毁被定义为进程的立即终止,而正常终止允许进程干净地关闭。如果进程不活动,则不执行任何操作。来自onExit()的CompletableFuture在进程终止时完成。
public Process destroyForcibly()
强行杀死这个过程。此Process对象表示的进程被强制终止。强制进程销毁被定义为进程的立即终止,而正常终止允许进程干净地关闭。如果进程不活动,则不执行任何操作。来自onExit()的CompletableFuture在进程终止时完成。
在ProcessBuilder.start()和Runtime.exec(java.lang.String)返回的Process对象上调用此方法会强制终止该进程。
API注意:
该过程可能不会立即终止。 ieAlive()可以在调用destroyForcibly()后的短暂时间内返回true。如果需要,可以将此方法链接到waitFor()。实现要求:此方法的默认实现调用destroy(),因此可能不会强制终止进程。实现注意:强烈建议使用此类的具体实现来使用兼容的实现来覆盖此方法。
返回:
表示强制销毁的进程的Process对象