【问题标题】:What is the ideal way to terminate a java subprocess? process.destroyForcibly() doesn't terminate my process [duplicate]终止java子进程的理想方法是什么? process.destroyForcibly() 不会终止我的进程[重复]
【发布时间】:2018-08-30 06:15:54
【问题描述】:

我有一个创建子进程的 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”只杀死子进程吗?

【问题讨论】:

  • 能否请您向我们展示您如何启动子流程以及如何尝试暂停它...
  • 如果您有工作代码,请提供minimal reproducible example,否则我们无法帮助您。除此之外,停止进程是一个已解决的、有据可查的话题。所以:请在此处发布问题之前进行扎实的研究。
  • 然后: System.exit() 杀死你的 JVM,包括所有子进程。但也是父级,所以这不是你打算使用的(大部分时间)。
  • 如果我在新进程中调用 System.exit() ,为什么会停止主进程?
  • 我不得不发布这个问题,因为大多数解决方案都不适合我。例如,请参阅 destory() 的 java 文档:“终止进程。此 Process 对象表示的进程是否正常终止取决于实现。”

标签: java swing process terminate


【解决方案1】:

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

Java 8 之前的版本

public abstract void destroy()

杀死子进程。这个Process代表的子流程 对象被强制终止。

Java 8

public abstract void destroy()

杀死子进程。 this所代表的子流程是否 进程对象是否被强制终止是实现 依赖。

public Process destroyForcibly()

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

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

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

Java 9

public abstract void destroy​()

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

public Process destroyForcibly​()

强制终止进程。这个Process代表的进程 对象被强制终止。定义了强制进程破坏 作为进程的立即终止,而正常终止 允许进程干净地关闭。如果进程不存在, 不采取任何行动。 onExit() 中的 CompletableFuture 已完成 当进程终止时。

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

API 说明:

进程可能不会立即终止。即 isAlive() 可能会返回 在调用destroyForcibly() 后的短时间内为真。这种方法 如果需要,可以链接到 waitFor()。实施要求: 此方法的默认实现调用destroy(),因此可能 不要强行终止进程。实施说明:具体 强烈鼓励此类的实现覆盖它 具有兼容实现的方法。

返回:

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

【讨论】:

  • 不错的综合列表 ;-)
猜你喜欢
  • 2015-01-27
  • 2014-10-25
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2011-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-10-16
相关资源
最近更新 更多