终止java子进程的理想方法是什么? process.destroyForcibly()不会终止我的进程[重复]

问题描述 投票:0回答:1

这个问题在这里已有答案:

我有一个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”来杀死子进程吗?
java swing process terminate
1个回答
1
投票

这真的取决于你的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对象

© www.soinside.com 2019 - 2024. All rights reserved.